鉴于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中对其进行过测试,但是此宏似乎可以完成工作。
现在,我的问题是这个宏是否可靠?我的意思是,不同的编译器和不同的优化标志可能会产生不同的结果吗?
答案 0 :(得分:2)
我的意思是,不同的编译器和不同的优化标志可能会产生不同的结果吗?
是的,这是可能的。您的代码不可靠。
如果编译器支持C11,则可以改用static assertion:
#include <assert.h>
...
static_assert(sizeof(maybeStr[0]) == 1, "parameter must be a string");