有什么问题:
#warning "Come back and implement this"
#warning "Do not do that!"
#warning "Must fix this before release"
#warning
通常,编译器会在错误或警告消息中包含参数(或之后的材料) 。
而且,通常,如果编译器检测到需要警告的内容,它会相当清楚地报告它。
鉴于要求,我认为解决此问题的唯一方法是保护#warning
指令......
#ifdef DO_WARNINGS
#warning "Some warning"
#endif /* DO_WARNINGS */
大多数时候,你编译时不使用-DDO_WARNINGS
; 当您需要检查#warning
警告(使用-Werror
)时,您-DDO_WARNINGS
毕竟要接受编译将失败的事实。请记住,make -k
即使存在个别编译错误,它也会尽可能地发挥作用。
GCC 4.4.1 手册的第 5.52.9 节说(部分):
5.52.9 诊断编译指示
GCC 允许用户有选择地启用或禁用某些类型的诊断,并更改诊断的类型。例如,一个项目的策略可能要求所有源都使用“-Werror”进行编译,但某些文件可能有例外,允许特定类型的警告。或者,项目可能会选择性地启用诊断并将其视为错误,具体取决于定义的预处理器宏。
#pragma GCC diagnostic kind option
修改诊断的处置。请注意,并非所有诊断都是可修改的;目前只能控制警告(通常由'-W...'控制),而不是全部。使用“-fdiagnostics-show-option”来确定哪些诊断是可控的,哪些选项控制它们。kind 是 'error' 以将此诊断视为错误, 'warning' 将其视为警告(即使 '-Werror' 有效),或 'ignored' 如果要忽略诊断。option 是与命令行选项匹配的双引号字符串。
#pragma GCC diagnostic warning "-Wformat"
#pragma GCC diagnostic error "-Wformat"
#pragma GCC diagnostic ignored "-Wformat"
请注意,这些 pragma 会覆盖任何命令行选项。此外,虽然将这些 pragma 放在源中的任何位置在语法上是有效的,但它们唯一支持的位置是在定义任何数据或函数之前。否则可能会导致不可预知的结果,具体取决于优化器如何管理您的源。如果多次列出相同的选项,则指定的最后一个选项是有效的选项。此 pragma 并非旨在作为命令行选项的通用替代品,而是用于实施对项目策略的严格控制。
GCC 还提供了一种在编译期间打印消息的简单机制。
#pragma message string
在编译时将字符串打印为编译器消息。该消息仅供参考,既不是编译警告也不是错误。
#pragma message "Compiling " __FILE__ "..."
字符串可以用括号括起来,并打印位置信息。
我不确定你是否想把你的#warning
线条编辑成#pragma message
线条。它可以帮助您解决问题 - 并且只比在可能由较少编译器支持的#warning
in周围添加条件编译更糟糕。#pragma message
这取决于您的可移植性要求。