c++ - 宏 `assert` ,为什么它不能在全局范围内编译?

标签 c++ macros assert

cppreference 中的这段代码不编译。我知道问题与 assert 宏在全局范围内扩展的事实有关。也就是说,如果我们包含下面的代码部分,以 assert(sieof(S)==8); 开头的函数内部,例如 main(),代码将起作用。

#include <cassert>
struct S {
    char c;  // 1 byte value
             // 3 bytes padding
    float f; // 4 bytes value
    bool operator==(const S& arg) const { // value-based equality
        return c == arg.c && f == arg.f;
    }
};
assert(sizeof(S) == 8);
S s1 = {'a', 3.14};
S s2 = s1;
reinterpret_cast<char*>(&s1)[2] = 'b'; // change 2nd byte
assert(s1 == s2); // value did not change

但我想了解为什么代码无法编译,如原始代码中所述。比如在VS2013中,宏定义如下:

    #define assert(_Expression) (void)( (!!(_Expression)) ||
             (_wassert(_CRT_WIDE(#_Expression), _CRT_WIDE(__FILE__), __LINE__), 0) )

并且编译器报错并显示以下错误消息:

error C2062: type 'void' unexpected

明显的问题是:为什么 voidmain 中被接受,但在全局范围内却不被接受?

请参阅 clang 中的错误消息.

最佳答案

全局范围只能包含声明。断言宏扩展为表达式语句,不能出现在全局范围内。

关于c++ - 宏 `assert` ,为什么它不能在全局范围内编译?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31654017/

相关文章:

iphone - 闯入 iPhone 上的调试器

c++ - 为什么仅函数模板的模板参数推导/替换失败?

c - 带参数的字符串宏扩展。 C

c - 四舍五入到 2 的幂(使用预处理器常量)

phpUnit -assertQuery 失败并显示

Verilog 中的断言语句

c++ - '.' 在输出中意味着什么?

c++ - std::contiguous_iterator 有什么用?

python - OpenCV - 从 C++ 到 Python 打开一个 XML 文件

c - 警告 : ISO C forbids an empty translation unit