【问题标题】:Suppress GCC warning "extra tokens at end of #include directive"禁止 GCC 警告“#include 指令末尾的额外标记”
【发布时间】:2013-01-11 14:53:26
【问题描述】:

我正在用 C 语言编写一个程序,旨在在 HP NonStop 机器上编译和运行。但是,我想在运行 Linux 的工作站上进行主要开发。 HP NonStop C 编译器需要非标准 #include 指令,如下所示:

#include <stdio.h> nolist

对于每个 #include 指令,我的工作站的 GCC 都在抱怨:

S88USF.c:139:21: warning: extra tokens at end of #include directive

我怎样才能抑制这个特定的警告?

注意:在 SO 上,已经提出了类似的问题,正确的答案是“一开始就不要给 gcc 任何抱怨的理由”。然而,在这种情况下,我明确希望 #include 指令与它们完全一样。

我知道我在做什么,只是不知道如何通知 gcc。

【问题讨论】:

  • 我已经投票决定以重复的形式关闭——在这种情况下,确实有很多关于 SO 的问题,包括关于如何抑制警告的具体答案,而不仅仅是“不要给 gcc 任何理由首先抱怨”。
  • 其他问题涉及通过-Wblah标志族打开和关闭警告,根据GNU CPP Manualcpp的@987654329描述下的GNU CPP Manual在这种情况下不适用@ 选项:“请注意,许多预处理器的警告默认情况下是打开的,并且没有选项来控制它们。”所以,这毕竟不是重复的。
  • 在回答了一个有点相关的问题here 后,我遇到了这个问题。如果您可以改用clang,据我所知它支持-Wno-extra-tokens,这将是一个干净的解决方案。

标签: c gcc warnings compiler-warnings gcc-warning


【解决方案1】:

一种解决方法是定义一个包含以下 preproccesor 宏的标头:

//hp_workaround.h
#ifdef HP_
#define HP_INCLUDE_DIRECTIVE(x) x
#else
#define HP_INCLUDE_DIRECTIVE(x) 
#endif

然后用这个宏保护你的指令

#include "hp_workaround.h"
#include <stdio.h> HP_INCLUDE_DIRECTIVE(nolist)

【讨论】:

    【解决方案2】:

    在 include 中发生的宏扩展可能会有所帮助。

    GCC 会接受这个:

    #define nolist
    #include <stdlib.h> nolist
    /* maybe #undef nolist here */
    

    【讨论】:

    • 我更喜欢使用-Wsuppress-extra-tokens-warning 之类的东西来禁用 GCC 警告,但这个解决方案似乎是下一个最好的方法。谢谢!
    猜你喜欢
    • 2022-12-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-10-29
    • 1970-01-01
    相关资源
    最近更新 更多