在公共头文件中使用条件是一种良好的做法吗?

Ste*_*eve 10 c automake gnu shared-libraries

我的C库有一些可选功能,使用automake,用户可以通过提供配置标志来打开和关闭它们.

如果关闭某个功能,则不会编译该功能.

但是,我的问题是,在这种情况下,我是否应该从公共头文件中删除函数原型?

这似乎不是一个好主意,有未编译函数的函数原型,但它对我来说不是一个好主意,有不同的公共报头装取决于库配置.(类似于config.h在公共头文件目录中安装的不良做法.)

对于可选功能,公共标题的最佳方法是什么?如果用户尝试使用禁用的功能,错误应该在编译时还是链接时?这种情况必须有标准做法.(如果有多个想法,我更愿意遵守GNU编码标准,但我不知道关于这个问题的GNU标准.)

Jar*_*Par 1

我认为这个问题有两种有效的方法

  • 有一个头文件,用于#ifdef删除某些配置中不支持的函数
  • 拥有多个头文件,其中#ifdef每个头文件都特定于某个配置

对于给定的配置,将库中不存在的函数保留在头文件中似乎是一种非常糟糕的做法。它将处理应该是编译时错误的错误并将其移至链接器错误。