“extern char condition tricks”是什么?

10
我正在阅读有关C和C++函数属性的GCC文档。在errorwarning属性的描述中,文档随意提到以下“技巧”:

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

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

虽然可以将函数未定义并因此引发链接失败(以带有消息的.gnu.warning*部分定义函数),但使用这些属性时,即使存在内联函数或不发出调试信息,问题也会更早地被诊断出来,并且可以准确地确定调用位置。

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

这是C语言中的一种方法,用于在编译时检查条件是否为真。如果你愿意,可以将其视为静态断言。然而,我无法记得我在哪里看到过这个。我依稀记得Linux内核宏使用了这个技巧。 - bolov
1个回答

7

我认为这个前提是要具备编译时断言的功能。假设你写了如下代码:

extern char a[(condition) ? 1 : -1];

如果conditiontrue,则不会发生任何事情,并且该行代码不会被编译。使用extern确保a不使用任何内存。但是,如果conditionfalse,则a将被声明为长度为负数的数组,并且您将在编译时出现错误。
您可能会将其包装在宏中,并拥有类似于static_assert的东西。
#define STATIC_ASSERT(condition) extern char a[(condition) ? 1 : -1]

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接