如何禁用特定的未知#pragma警告?(海湾合作委员会和/或铿锵)

Cyg*_*sX1 25 c++ gcc clang

我知道如何禁用所有未知的#pragma警告.答案是,例如,这里:SO:如何禁用#pragma警告?

我的问题是 - 有没有办法禁用一个特定的pragma''unknown pragma'警告?例如,如果我禁用#pragma ugubugu以下代码的警告:

#pragma ugubugu
#pragma untiunti   
int main() {return 0;}
Run Code Online (Sandbox Code Playgroud)

用以下任何一个编译时

g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall
Run Code Online (Sandbox Code Playgroud)

应该产生一个警告:

warning: ignoring #pragma untiunti
Run Code Online (Sandbox Code Playgroud)

也许,例如,有一种简单的方法来注册一个什么都不做的自定义编译指示?

很高兴知道是否有这样的选项也是Visual Studio,但这不太重要.

谢谢!


"但为什么最终他会玩定制的pragma?"

我的源代码由两个编译器解析.在其中一个中,有一个特殊的#pragma,另一个是未知的.当然,我可能会把#ifdef COMPILER_IDENTIFICATION_MACRO ... #endif每个实例都放在一边,#pragma但那会很麻烦.

Mat*_*ery 18

我有理由相信没有办法做到这一点.

GCC和Clang都有内部接口,允许语言前端向#pragma预处理器注册处理程序 - 参见GCC libcpp/directives.c和Clang lib/Lex/Pragma.cpp- 但是,据我所知,没有任何东西可以让你修改哪些处理程序已注册(超出隐含的内容)根据命令行选项,通过您正在编译的语言变体.

我知道如何禁用所有未知的#pragma警告.答案是,例如,这里:SO:如何禁用#pragma警告?

请注意,投票最高的答案要比那里接受的答案要好. -Wno-unknown-pragmas可以简单地在命令行上被添加任何东西(像-Wall),其转动警告上.

我的源代码由两个编译器解析.在其中一个中,有一个特殊的#pragma,另一个是未知的.当然,我可能会把#ifdef COMPILER_IDENTIFICATION_MACRO ... #endif每个实例都放在一边,#pragma但那会很麻烦.

从更加哲学的角度来看,我认为这确实是正确的解决方案,虽然可能很麻烦!

我认为#pragma从编译器中隐藏任何不希望按照你想要的方式理解它的任何东西似乎是正确的,因为整个观点#pragma是提供一种在编译器中调用实现定义的行为的机制.

(如果你最终做这个,注意锵定义__clang__,但 GCC和锵定义__GNUC__.)


sff*_*ffc 7

我假设您想禁用编译指示警告,因为它在一个平台上有效但在另一个平台上无效。如果是这种情况,您可以使用宏来有选择地启用编译指示,从而无需抑制警告。

例如,如果您只想要 Visual C++ 上的编译指示,您可以执行以下操作:

#if defined(_MSC_VER)
#    define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu)
#else
#    define SAFE_PRAGMA_UGUBUGU 
#endif
Run Code Online (Sandbox Code Playgroud)

然后,你可以写

SAFE_PRAGMA_UGUBUGU
#pragma untiunti   
int main() {return 0;}
Run Code Online (Sandbox Code Playgroud)