Утверждение времени компиляции на основе оператора sizeof - PullRequest
0 голосов
/ 03 ноября 2018

Учитывая тот факт, что оператор 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 , но этот макрос, похоже, справляется с работой.

Теперь, мой вопрос, является ли этот макрос твердым? Я имею в виду, возможно ли, что разные компиляторы и разные флаги оптимизации приведут к разным результатам?

1 Ответ

0 голосов
/ 03 ноября 2018

Я имею в виду, возможно ли, что разные компиляторы и разные флаги оптимизации приведут к разным результатам?

Да, это возможно. Ваш код не является надежным.

Если ваш компилятор поддерживает C11, вместо него можно использовать статическое утверждение :

#include <assert.h>
...
static_assert(sizeof(maybeStr[0]) == 1, "parameter must be a string");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...