Учитывая тот факт, что оператор sizeof()
является оператором времени компиляции (с этот принятый StackOverflow ответ) я попытался выполнить проверку типа времени компиляции на его основе.
Чего я хочу добиться, так это проверки во время компиляции, является ли параметр массивом символов, и если нет, то вызывает ошибку компиляции. Мое решение основано на том, что символ потребляет один байт. Итак, я придумал это:
#define assert(maybeStr)\
extern int varaible_not_exist;\
if (sizeof(maybeStr[0]) != 1)\
{\
varaible_not_exist++;\
}
Я выяснил, если sizeof(maybeStr[0])
вычисляется во время компиляции, тогда все if
может быть вычислено во время компиляции, что означает, что в случае, если оператор if
ложен (maybeStr
действительно символы массив) во время компиляции, varaible_not_exist++
не будет скомпилирован в конечном итоге, и ошибка компиляции не будет. И наоборот, если оператор if
имеет значение true (maybeStr
не массив символов), то varaible_not_exist++
будет скомпилировано и возникнет ошибка компиляции.
Короче говоря, похоже, работает. Пока я тестировал его только в online-c-compiler , но этот макрос, похоже, справляется с работой.
Теперь, мой вопрос, является ли этот макрос твердым? Я имею в виду, возможно ли, что разные компиляторы и разные флаги оптимизации приведут к разным результатам?