抑制GCC警告“#include指令末尾有额外的标记”

3

我正在编写一款用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。


可能是在gcc中禁用特定警告的重复问题。 - Vicky
我已经投票将其关闭为重复 - 在SO上确实有很多关于这种情况的问题,包括有关如何抑制警告的具体答案,而不仅仅是“首先不要给gcc任何理由抱怨”。 - Vicky
可能是如何在g++中抑制特定警告的重复问题。 - Jonathan Leffler
其他问题涉及通过“-Wblah”系列标志打开和关闭警告,但根据GNU CPP手册中cpp的“-Wall”选项的描述,在这种情况下不适用:“请注意,许多预处理器的警告默认情况下是开启的,并且没有选项来控制它们。”所以,这并不是重复的。 - LThode
2
在回答一个有点相关的问题[这里](https://dev59.com/Mobca4cB1Zd3GeqPY61f)之后,我遇到了这个问题。如果您可以使用`clang`,则可以使用`-Wno-extra-tokens`,这将是一个干净的解决方案。 - Shafik Yaghmour
2个回答

8
一个解决方法是定义一个包含以下预处理器宏的标头:
//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警告,但这个解决方案似乎是次优的。谢谢! - Philip

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