- 此问题在此处已有答案**:
Is there a portable way to print a message from the C preprocessor?(6个答案)
13小时前关门了。
这篇文章是10小时前编辑并提交审查的。
我有一个广泛使用的C99库,它有多个头文件。我需要弃用一个特定的头文件。我想为用户创建一个编译器警告,告诉用户这个头文件将被弃用。
理想情况下,我希望使用诊断指令#warning
#warning "Warning this header file will be removed!"
然而,这直到C23才成为C标准的一部分。
在C23中标准化之前,#warning已经被许多编译器在所有模式下提供为一致的扩展名。-cppreference
要在尽可能多的编译器上为用户创建警告,最好的方法是什么?
编辑:
为了澄清,仅仅打印到构建日志是不够的。理想情况下,编译器会生成一个警告。
1条答案
按热度按时间mdfafbf11#
最简单的解决方案就是使用
#warning
。正如your quoted cppreference page所说,在它在C23中正式标准化之前,编译器已经使用它很多年了。正如chrslg所指出的,在 * 不 * 支持它的编译器上使用它会产生一个不支持预处理指令的错误,这应该足以提醒程序员停止使用头文件。如果您需要完全兼容C89的解决方案,您可以:
这会将警告视为错误,除非使用过时标头(或其Makefile标志)的程序定义了
IGNORE_DEPRECATION
宏以允许程序无论如何都要编译。或者,你可以把所有的函数都标记为deprecated。在the
deprecated
attribute在C23中被标准化之前,编译器有一些定制的方法来做这件事:__declspec(deprecated)
或__declspec(deprecated("custom message"))
。__attribute__((deprecated))
或(在8.0及更高版本中)__attribute__((deprecated("custom message")))
。如果您走这条路,您可能希望将这些属性抽象到宏后面(基于
_MSC_VER
和__GNUC__
版本进行条件编译)。