上下文
想象一些代码的正确性取决于一些值对其他值的加减,这样在编译时就可以知道是否应该中止编译。
例如:
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 以来是标准的,如 Static assert in 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");
| ^~~~~~~~~~~~~~
关于c - 简单算术完整性检查强制 C 编译错误(加法、减法必须匹配),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63927518/