上下文
想象一下,某些代码的正确性取决于某个值的加法或减法,这样在编译时就可以知道是否应该中止编译。
例如:
some.h
#define A 100
#define B 20
#define C 120
想象一下,some.c
中的代码假设A+B == C
,否则编译它甚至没有意义
愿望
如果A+B
不等于C
,我们希望some.c
的编译失败。
some.cpp
#include "some.h"
#define CONTROL ((A)+(B)-(C))
something_that_cause_compilation_failure_if_argument_is_non_zero(CONTROL)
非解决方案
这不起作用,因为预处理器不做算术,只做字符串替换:
#if CONTROL
#else
#error MISMATCH
#endif
这是由静态断言解决的,并且是标准的,因为C11由C 中的静态断言指示
test.c
#define A 100
#define B 20
#define C 120
_Static_assert ( A+B == C, "A+B not equal to C");
int main()
{
return 42;
}
gcc --std=c11 fail.c -o fail && echo SUCCESS
SUCCESS
如果值发生变化:
gcc --std=c11 fail.c -o fail
fail.c:14:1: error: static assertion failed: "A+B not equal to C"
14 | _Static_assert ( A+B == C, "A+B not equal to C");
| ^~~~~~~~~~~~~~