C++ #警告预处理器指令的可移植性

C++ #警告预处理器指令的可移植性,c++,compiler-construction,warnings,c-preprocessor,portability,C++,Compiler Construction,Warnings,C Preprocessor,Portability,我知道#warning指令不是标准的C/C++,但有几个编译器支持它,包括gcc/g++。但是对于那些不支持它的人,他们会默默地忽略它还是会导致编译失败?换句话说,我能在我的项目中安全地使用它而不破坏不支持它的编译器的构建吗?事实上,我所知道的大多数编译器都会忽略未知的pragma指令,并输出一条警告消息-因此在最坏的情况下,您仍然会收到警告。如果编译器不支持警告,然后它将发出一个错误。与#pragma不同,不建议预处理器忽略它不理解的指令 话虽如此,我在各种不同(相当常见)的平台上使用过编译器

我知道#warning指令不是标准的C/C++,但有几个编译器支持它,包括gcc/g++。但是对于那些不支持它的人,他们会默默地忽略它还是会导致编译失败?换句话说,我能在我的项目中安全地使用它而不破坏不支持它的编译器的构建吗?

事实上,我所知道的大多数编译器都会忽略未知的pragma指令,并输出一条警告消息-因此在最坏的情况下,您仍然会收到警告。

如果编译器不支持警告,然后它将发出一个错误。与#pragma不同,不建议预处理器忽略它不理解的指令


话虽如此,我在各种不同(相当常见)的平台上使用过编译器,它们都支持#警告。

即使代码块未包含在编译中,您可能至少会从不识别#警告的编译器中得到一个无法识别的指令警告。这可能会被视为错误,也可能不会被视为错误——编译器可以合法地将其视为错误,但许多编译器会更宽松

您是否知道(您能说出)除GCC/G++之外的编译器提供了#警告?
[编辑:Sun Solaris 10(Sparc)和Studio 11 C/C++编译器都接受#警告。

我曾经在Atmel处理器的编译器中遇到过这个问题。由于未知的#警告标记,它确实生成了预处理器错误


不幸的是,解决方案似乎是将整个源代码树转换为使用#pragma等价物,并接受如果使用gcc,构建行为将有所不同。

应该注意的是,MSVC使用以下语法:

#pragma message ( "your warning text here" ) #pragma消息(“此处为您的警告文本”) 通常的警告语法会生成致命错误

C1021: invalid preprocessor command 'warning' C1021:无效的预处理器命令“警告”
因此,它不能移植到那些编译器。

在从mingw切换到visual studio时,我将这些行添加到了我的全局配置头中。(包括在stdafx.h中)

现在我使用PRAGMA_警告(这需要修复)

遗憾的是,gcc中没有
#pragma警告,因此它警告未指定的pragma


我怀疑gcc是否会添加
#pragma警告“
而不是微软添加的
#警告

然而,警告并不是一个杂注。这是MS以正确的方式做事的罕见情况之一。MSVC语法可移植吗?我的意思是,它会正确地与其他编译器生成警告吗?在MSVC 2008中,pragma消息也不会生成警告-它只是将文本输出到构建日志。因此,f.i.不会显示在
错误列表
窗口中,也不会增加警告总数。如果您在消息中放置“警告”,则它仍将被视为警告,例如#pragma消息(“警告:foo”)fwiw,此语法也适用于openwatcom。(是的,我碰到了一条旧线索。人们将永远使用谷歌这样的东西)显然你从未尝试过微软Visual Studio Professional 2015;-)@彼得拉·施耐德:当然在2008年我没有!
#ifdef __GNUC__
//from https://gcc.gnu.org/onlinedocs/gcc/Diagnostic-Pragmas.html
//Instead of put such pragma in code:
//#pragma GCC diagnostic ignored "-Wformat"
//use:
//PRAGMA_GCC(diagnostic ignored "-Wformat")
#define DO_PRAGMA(x) _Pragma (#x)
#define PRAGMA_GCC(x) DO_PRAGMA(GCC #x)

#define PRAGMA_MESSAGE(x) DO_PRAGMA(message #x)
#define PRAGMA_WARNING(x) DO_PRAGMA(warning #x)
#endif //__GNUC__
#ifdef _MSC_VER
/*
#define PRAGMA_OPTIMIZE_OFF __pragma(optimize("", off))
// These two lines are equivalent
#pragma optimize("", off)
PRAGMA_OPTIMIZE_OFF
*/
#define PRAGMA_GCC(x)
// https://support2.microsoft.com/kb/155196?wa=wsignin1.0
#define __STR2__(x) #x
#define __STR1__(x) __STR2__(x)
#define __PRAGMA_LOC__ __FILE__ "("__STR1__(__LINE__)") "
#define PRAGMA_WARNING(x) __pragma(message(__PRAGMA_LOC__ ": warning: " #x))
#define PRAGMA_MESSAGE(x) __pragma(message(__PRAGMA_LOC__ ": message : " #x))

#endif

//#pragma message "message quoted"
//#pragma message message unquoted

//#warning warning unquoted
//#warning "warning quoted"

PRAGMA_MESSAGE(PRAGMA_MESSAGE unquoted)
PRAGMA_MESSAGE("PRAGMA_MESSAGE quoted")

#warning "#pragma warning quoted"

PRAGMA_WARNING(PRAGMA_WARNING unquoted)
PRAGMA_WARNING("PRAGMA_WARNING quoted")