#warning预处理器指令的可移植性

jon*_*ner 53 c++ compiler-construction portability warnings c-preprocessor

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

nol*_*dda 72

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

#pragma message ( "your warning text here" )

通常的#warning语法会产生致命错误

C1021: invalid preprocessor command 'warning'

所以它不适合那些编译器.

  • 当MS以正确的方式做事时,这是极少数情况之一. (23认同)
  • 如果你在消息中加上"警告",那么它仍会被视为警告,例如#pragma message("warning:foo") (10认同)
  • 在MSVC 2008中,`#pragma message`也不会生成警告 - 它只是将文本输出到构建日志.因此,它不会显示在"错误列表"窗口中,也不会增加警告的总数. (5认同)
  • fwiw,这个语法也适用于openwatcom.(是的,我碰到了一个旧线程.人们会永远这样谷歌的东西) (3认同)
  • 刚刚使用 gcc-4.7.2 进行了快速检查。[$ gcc -c -Werror file.c] 产生 [file.c:10:9: note: #pragma message: Foo bar baz] 所以它产生一个不被视为警告的“注释”(即它不t 在启用 -Werror 的情况下使构建失败)。但它似乎正确解析(所有#pragmas 都应该如此),因此从这个意义上说它是可移植的。 (2认同)

Gre*_*ill 30

如果编译器不支持#warning,则可能会发出错误.与#pragma不同,不建议预处理器忽略它不理解的指令.

话虽如此,我已经在各种不同(相当常见的)平台上使用了编译器,并且他们都支持#warning.

  • @ PeterA.Schneider:当然在2008年我没有! (19认同)
  • 显然你从未尝试过MS Visual Studio Professional 2015 ;-). (9认同)