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

时间:2011-07-02 12:41:18

标签: c++ gcc clang

我知道如何禁用所有未知的#pragma警告。例如,答案在这里给出:SO: How to 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,但这会很麻烦。

3 个答案:

答案 0 :(得分:16)

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

GCC和Clang都有内部接口,允许语言前端向预处理器注册#pragma个处理程序 - 请参阅GCC的libcpp/directives.c和Clang的lib/Lex/Pragma.cpp - 但是,尽我所能看,没有什么可以让你根据命令行选项修改哪些处理程序被注册(超出你正在编译的语言变体隐含的处理程序)。

  

我知道如何禁用所有未知的#pragma警告。例如,答案在这里给出:SO: How to disable #pragma warnings?

请注意,投票最高的答案要比那里接受的答案要好。只需在之后的命令行上添加-Wno-unknown-pragmas即可启用警告的任何内容(如-Wall)。

  

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

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

对于我来说,隐藏编译器中的任何#pragma似乎是正确的,因为#pragma的全部要点是提供一种机制,所以编译器不会以您想要的方式理解它。在编译器中调用实现定义的行为。

(如果你最终这样做,请注意Clang定义__clang__,但两者 GCC和Clang定义__GNUC__。)

答案 1 :(得分:2)

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

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

#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;}

答案 2 :(得分:-3)

  • 编译器不允许自定义编译指示,因为编译指示(主要)是编译器和/或链接器控制指令。由于这非常接近特定的编译器实现和功能,为用户“定义新的pragma”的应用是什么?实际上,在特定编译器上实现的可用pragma指令完全独立于供应商(没有C ++标准化规则)。
  • 您可能希望使用编译指示来标记代码的特殊部分(例如,为您自己的预处理器提供信息),因为您要求使用no-op指令。这可以使用预处理器(#defines)完成。
  • C / C ++代码中自定义“标记”的另一种可能性,例如:#MY_PRAGMA是在C / C ++之前使用您自己的预处理器。

此类处理的一个示例用于QT库,即与Qt MOC编译器交互的非标准Metaobject系统。这用于扩展一些非C ++构造(例如Q_OBJECT,Q_PROPERTY等),这些构造稍后用有效的语法提供给C ++编译器。