基于sizeof运算符的编译时间断言

时间:2018-11-03 20:20:15

标签: c compiler-errors assert

鉴于sizeof()运算符是编译时运算符(来自this StackOverflow接受的答案)这一事实,我尝试着继续并基于该运算符执行编译时类型检查。

我要实现的是编译时检查参数是否为字符数组,如果不是,则引发编译错误。我的解决方案基于字符消耗一个字节的事实。所以我想出了这个:

#define assert(maybeStr)\
    extern int varaible_not_exist;\
    if (sizeof(maybeStr[0]) != 1)\
    {\
        varaible_not_exist++;\
    }

我知道如果sizeof(maybeStr[0])是在编译时求值的,那么整个if可以在编译时求值的,这意味着如果if语句为false( maybeStr实际上是字符数组),在编译时,varaible_not_exist++最终不会被编译,并且不会发出任何编译错误。反之亦然,如果if语句为真(maybeStr不是字符数组),则比varaible_not_exist++编译,并且会出现编译错误。

长话短说,它似乎正在工作。我目前仅在online-c-compiler中对其进行过测试,但是此宏似乎可以完成工作。

现在,我的问题是这个宏是否可靠?我的意思是,不同的编译器和不同的优化标志可能会产生不同的结果吗?

1 个答案:

答案 0 :(得分:2)

  

我的意思是,不同的编译器和不同的优化标志可能会产生不同的结果吗?

是的,这是可能的。您的代码不可靠。

如果编译器支持C11,则可以改用static assertion

#include <assert.h>
...
static_assert(sizeof(maybeStr[0]) == 1, "parameter must be a string");