代码之家  ›  专栏  ›  技术社区  ›  Boann

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

  •  5
  • Boann  · 技术社区  · 4 年前

    我在看书 the GCC documentation on C and C++ function attributes .在 error 和 warning 属性时,文档会随意提到以下“技巧”:

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

    如果 错误 或 警告 属性用于函数声明,对此类函数的调用不会通过死代码消除或其他优化消除,错误或警告(分别)包括 消息 被诊断出来了。 这对于编译时检查非常有用,尤其是与 __builtin_constant_p 以及内联函数,其中无法通过 extern char [(condition) ? 1 : -1]; 把戏。

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

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

    0 回复  |  直到 4 年前
        1
  •  7
  •   Passer By    4 年前

    我认为前提是拥有编译时断言功能。假设你写了

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

    如果 condition 是 true ,什么都没有发生,这行代码编译成了零。这个 extern 确保 a 不使用任何内存。然而,如果 条件 是 false , A. 声明为负长度数组,则会出现编译时错误。

    您可能会将其包装在宏中,并具有类似于 static_assert

    #define STATIC_ASSERT(condition) extern char a[(condition) ? 1 : -1]