Почему я не могу использовать sizeof () в #if? [дубликат]

12
задан Brian Tompsett - 汤莱恩 22 February 2016 в 18:30
поделиться

3 ответа

Потому что sizeof() вычисляется после запуска препроцессора, поэтому информация недоступна для #if.

Компиляторы языка Си логически разделены на две фазы, даже если большинство современных компиляторов не разделяют их. Сначала исходный текст подвергается предварительной обработке. Это включает в себя разработку и замену всех условий препроцессора (#if, #define, замена определенных слов на их заменители). Затем исходный текст передается, обработанный, самому компилятору. Препроцессор лишь минимально осведомлен о структуре языка C, у него нет знаний о типах, поэтому он не может работать с конструкциями уровня компилятора, такими как sizeof().

12
ответ дан 2 December 2019 в 23:07
поделиться

Класс - это структура данных, а локализованное форматирование последовательностей - это поведение. С точки зрения кода/компилятора, эти две вещи не имеют ничего общего с другими, и нет смысла устанавливать их на основе «на класс». Эта проблема относится к области кода, в которой используется класс, или к коду внутри самого класса.

Информация о глобальной культуре набора для каждого потока (с помощью Thread.CurrentThread.CurrentCulture или CultureInfo.CurrentCulture ). Одно, что вы можете сделать, это обернуть каждый метод класса в набор культуры/восстановление. Так как культура потоков является для всех целей глобальной переменной, это может стать проблематичным, если ваш класс когда-либо звонит куда-либо еще.

Лучший подход, если вы хотите указать культуру для использования классом, состоит в том, чтобы просто иметь экземпляр культуры для использования в качестве свойства класса, а затем использовать специфичные для культуры перегрузки большинства функций форматирования строк/чисел.

class MyClass {
    public CultureInfo Culture { get; set; }

    public void GetSomeString() {
        return new Int32().ToString(Culture);
    }
}

Правка: Внимательно взглянув на ваш вопрос, я думаю, что вы хотите сделать что-то вроде:

var lastCulture = Thread.CurrentThread.CurrentCulture;
Thread.CurrentThread.CurrentCulture = CultureInfo.GetCultureInfo("en-US");
try {
   // loop over list here
}
finally {
    Thread.CurrentThread.CurrentCulture = lastCulture;
}
-121--4998037-

Я указываю на устаревшую статью для целей проверки этого на себе. Методы DOM на самом деле выбивают inureHTML на всех моих машинах, так что это то, что я предпочитаю. Тем не менее, во время статьи iniveHTML был быстрее в среднем. В настоящее время разница может быть видна только в огромных наборах данных резко.

-121--1693853-

Поскольку в директиве препроцессора можно использовать только литеральные константы. Кроме того, sizeof (int) всегда больше 0, поэтому я верю, что это #, если бы все время было правдой.

1
ответ дан 2 December 2019 в 23:07
поделиться

Рассмотрим:

#if sizeof(MyClass) > 3
   #define MY_CONSTRAINT 2
#endif

class MyClass
{
   #if MY_CONSTRAINT == 3
      int myMember = 3;
   #endif
};

Теперь, это, вероятно, написано не в правильном синтаксисе, так как прошло много времени с тех пор, как я последний раз занимался C++, но смысл все еще в силе :)

-3
ответ дан 2 December 2019 в 23:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: