在简单的算术健全性检查中强制C编译错误(加法、减法必须匹配)



上下文

想象一下,某些代码的正确性取决于某个值的加法或减法,这样在编译时就可以知道是否应该中止编译。

例如:

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");
| ^~~~~~~~~~~~~~

相关内容

  • 没有找到相关文章

最新更新