c - 简单算术完整性检查强制 C 编译错误(加法、减法必须匹配)

标签 c compiler-errors compilation assert static-assert

上下文

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

例如:

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/

相关文章:

c - 对 `pow' 的 undefined reference - makefile

c - 这段代码中究竟发生了什么?

c# - 我有一个奇怪的错误

gcc - libpthread.so.0 : error adding symbols: DSO missing from command line

c++ - 如何使用 visual studio 编译 c++ dll?

不使用cmake编译源码

c - 通过权重调整范围

c - 将结构中的二维数组分配给二维数组

java - Java 中的变量未初始化 - 错误 39

c++ - iostream.h 是否被编译?