什么是“外部字符条件技巧”?

Boa*_*ann 10 c c++ gcc compile-time

我正在阅读有关 C 和 C++ 函数属性的 GCC 文档error在和属性的描述中warning,文档不经意地提到了以下“技巧”:

error ("message")
warning ("message")

如果在函数声明上使用errororwarning属性,并且没有通过死代码消除或其他优化来消除对此类函数的调用,则会诊断出包含消息的错误或警告(分别)。这对于编译时检查很有用,特别是与__builtin_constant_p内联函数一起使用时,通过技巧无法检查内联函数参数extern char [(condition) ? 1 : -1];

虽然可以使函数未定义,从而调用链接失败(在.gnu.warning*节中使用消息定义函数),但使用这些属性时,即使存在内联函数或存在内联函数或调用的确切位置,也可以更早地诊断出问题。当不发出调试信息时。

没有进一步的解释。也许对于沉浸在环境中的程序员来说这是显而易见的,但对我来说却一点也不明显,而且我在网上找不到任何解释。这项技术是什么?我什么时候可以使用它?

Pas*_* By 7

我相信前提是要有编译时断言功能。假设你写了

extern char a[(condition) ? 1 : -1];
Run Code Online (Sandbox Code Playgroud)

如果conditiontrue,则什么也不会发生,并且该行编译为空。确保externa使用任何内存。但是,如果iscondition被声明为负长度数组,则会出现编译时错误。falsea

您可能将其包装在宏中并具有类似的内容static_assert

#define STATIC_ASSERT(condition) extern char a[(condition) ? 1 : -1]
Run Code Online (Sandbox Code Playgroud)