如何禁用特定的未知#pragma警告(GCC和/或Clang)



我知道如何禁用所有未知#pragma警告。例如,在How can I disable#pragma warnings中给出了答案

有没有办法为一个特定的杂注禁用"未知杂注"警告?例如,如果我禁用#pragma ugubugu的警告,则会出现以下代码:

#pragma ugubugu
#pragma untiunti
int main() {return 0;}

当使用以下任一项编译时:

g++ pragma.cpp -Wall
clang++ pragma.cpp -Wall

应该产生一个警告:

warning: ignoring #pragma untiunti

例如,有没有一种简单的方法可以注册一个自定义杂注,但它什么都不做?

如果知道Visual Studio是否也有这样的选项,那将是一件很好的事情,但这并不重要。


";但他最终为什么要玩弄自定义实用主义者呢">

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

我确信没有任何方法可以做到这一点。

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定义了__clang__,但GCC和Clang都定义了__GNUC__。(

我认为您想要禁用pragma警告,因为它在一个平台上有效,但在另一个平台则无效。如果是这种情况,您可以使用宏来选择性地启用杂注,从而无需抑制警告。

例如,如果您只想在Visual C++上使用杂注,您可以执行以下操作:

#if defined(_MSC_VER)
#    define SAFE_PRAGMA_UGUBUGU __pragma(ugubugu)
#else
#    define SAFE_PRAGMA_UGUBUGU 
#endif

然后,你可以写

SAFE_PRAGMA_UGUBUGU
#pragma untiunti   
int main() {return 0;}
  • 编译器不允许自定义杂注,因为杂注(主要(是编译器和/或链接器控制指令。由于这与特定的编译器实现和特性非常接近;定义新的杂注";为用户?事实上,在特定编译器上实现的可用pragma指令完全独立于供应商(没有C++标准化规则(
  • 您可能想要使用pragma来标记代码的特殊部分(例如,为您自己的预处理器提供信息(,因为您要求无操作指令。这可以使用预处理器(#defines(来完成
  • 定制的另一种可能性";标记";在C/C++代码中,例如#MY_PRAGMA,是在C/C++之前使用自己的预处理器

这类处理的一个例子用于Qt库,这是一个与QtMOC编译器交互的非标准元对象系统。这用于扩展一些非C++构造(例如,Q_OBJECT、Q_PROPERTY等(,这些构造稍后将使用有效语法提供给C++编译器。

最新更新