【发布时间】:2012-03-09 18:34:02
【问题描述】:
我的 C 库有一些可选功能,使用 automake,用户可以通过提供标志来配置来打开和关闭它们。
如果关闭某个功能,则不会编译该功能。
但是,我的问题是,在这种情况下,我是否还应该从公共标头中删除函数原型?
为未编译的函数设置函数原型似乎不是一个好主意,但在我看来,根据库配置安装不同的公共头文件也似乎不是一个好主意。 (类似于在公共标头目录中安装 config.h 是一种不好的做法。)
对于可选功能,公共标头的最佳方法是什么?如果用户尝试使用禁用的功能,错误应该出现在编译时还是链接时?这种情况必须有一个标准的做法。 (如果有多种想法,我更愿意遵守 GNU 编码标准,但我不知道 GNU 标准在这个问题上。)
【问题讨论】:
-
我认为如果未定义函数,最好不要包含原型,以便在编译时而不是链接时发现错误,但我不知道任何这方面的标准做法。我会使用#if。
-
@VaughnCato 如果原型被预处理器指令排除,您将收到编译器错误。
-
@LuchianGrigore 是的,完全正确。
-
@LuchianGrigore 是的,这正是重点:如果你让预处理器排除了实现,还要去掉声明,这样人们就会得到编译器错误而不是链接器错误(也可能是动态链接!)。
-
删除是什么意思?实际上删除文本?我会使用#if 来有效地删除它,而不是实际删除文本。
标签: c shared-libraries gnu automake