我知道如何禁用所有未知的#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
,但这会很麻烦。
答案 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)
此类处理的一个示例用于QT库,即与Qt MOC编译器交互的非标准Metaobject系统。这用于扩展一些非C ++构造(例如Q_OBJECT,Q_PROPERTY等),这些构造稍后用有效的语法提供给C ++编译器。