如何弃用C头文件?[duplicate]

9rygscc1  于 2023-01-04  发布在  其他
关注(0)|答案(1)|浏览(193)
    • 此问题在此处已有答案**:

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
要在尽可能多的编译器上为用户创建警告,最好的方法是什么?
编辑:
为了澄清,仅仅打印到构建日志是不够的。理想情况下,编译器会生成一个警告。

mdfafbf1

mdfafbf11#

最简单的解决方案就是使用#warning。正如your quoted cppreference page所说,在它在C23中正式标准化之前,编译器已经使用它很多年了。正如chrslg所指出的,在 * 不 * 支持它的编译器上使用它会产生一个不支持预处理指令的错误,这应该足以提醒程序员停止使用头文件。
如果您需要完全兼容C89的解决方案,您可以:

#ifndef IGNORE_DEPRECATION
    #error "This header will be removed in a future release.  Use MyNewHeader.h instead."
#endif

这会将警告视为错误,除非使用过时标头(或其Makefile标志)的程序定义了IGNORE_DEPRECATION宏以允许程序无论如何都要编译。
或者,你可以把所有的函数都标记为deprecated。在the deprecated attribute在C23中被标准化之前,编译器有一些定制的方法来做这件事:

  • Microsoft Visual C++使用__declspec(deprecated)__declspec(deprecated("custom message"))
  • GCC使用__attribute__((deprecated))或(在8.0及更高版本中)__attribute__((deprecated("custom message")))

如果您走这条路,您可能希望将这些属性抽象到宏后面(基于_MSC_VER__GNUC__版本进行条件编译)。

相关问题