首页 > 解决方案 > 基于 sizeof 运算符的编译时断言

问题描述

鉴于sizeof()operator 是一个编译时运算符(来自这个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语句为真(maybeStr不是字符数组),varaible_not_exist++则将被编译并引发编译错误。

长话短说,它似乎奏效了。我现在只在online-c-compiler中对其进行了测试,但这个宏似乎可以完成这项工作。

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

标签: ccompiler-errorsassert

解决方案


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

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

如果您的编译器支持 C11,则可以改用静态断言

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

推荐阅读