Потому что sizeof() вычисляется после запуска препроцессора, поэтому информация недоступна для #if
.
Компиляторы языка Си логически разделены на две фазы, даже если большинство современных компиляторов не разделяют их. Сначала исходный текст подвергается предварительной обработке. Это включает в себя разработку и замену всех условий препроцессора (#if, #define, замена определенных слов на их заменители). Затем исходный текст передается, обработанный, самому компилятору. Препроцессор лишь минимально осведомлен о структуре языка C, у него нет знаний о типах, поэтому он не может работать с конструкциями уровня компилятора, такими как sizeof().
Класс - это структура данных, а локализованное форматирование последовательностей - это поведение. С точки зрения кода/компилятора, эти две вещи не имеют ничего общего с другими, и нет смысла устанавливать их на основе «на класс». Эта проблема относится к области кода, в которой используется класс, или к коду внутри самого класса.
Информация о глобальной культуре набора для каждого потока (с помощью 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, поэтому я верю, что это #, если бы все время было правдой.
Рассмотрим:
#if sizeof(MyClass) > 3
#define MY_CONSTRAINT 2
#endif
class MyClass
{
#if MY_CONSTRAINT == 3
int myMember = 3;
#endif
};
Теперь, это, вероятно, написано не в правильном синтаксисе, так как прошло много времени с тех пор, как я последний раз занимался C++, но смысл все еще в силе :)