C++ 使用自动工具(C/C+;+;)生成可选源代码?

C++ 使用自动工具(C/C+;+;)生成可选源代码?,c++,c,makefile,autotools,C++,C,Makefile,Autotools,我有一个名为api.h的头文件,其中包含库的公共函数。我想要函数void func_xxx()时,才能在api.h中声明代码>。这可能吗?理想情况下,我不想为此使用#ifdef?我知道如何在我的configure.ac脚本中实现--enable xxx标志,但如果使用了--enable xxx,我不知道如何将函数声明添加到api.h 感谢您的帮助您想要实现的不是好的实践,因为正如您所提到的,您需要#如果预处理器宏,将config.h拖动到公共界面,因此必须安装它。配置文件并不意味着要安装 我建议

我有一个名为
api.h
的头文件,其中包含库的公共函数。我想要函数
void func_xxx()/configure--enable xxx
启用代码>时,才能在
api.h
中声明代码>。这可能吗?理想情况下,我不想为此使用
#ifdef
?我知道如何在我的
configure.ac
脚本中实现
--enable xxx
标志,但如果使用了
--enable xxx
,我不知道如何将函数声明添加到
api.h


感谢您的帮助

您想要实现的不是好的实践,因为正如您所提到的,您需要
#如果
预处理器宏,将
config.h
拖动到公共界面,因此必须安装它。配置文件并不意味着要安装

我建议您在运行时这样做,顺便说一句,这是一本非常推荐阅读的书中建议的实践:

bool isFuncXXXEnabled();
void funcxxx();
您的代码:

if (isFuncXXXEnabled()) {
}
else {
}

在.cpp文件中,您可以禁用函数体,因为`config.h将不会在公共界面中公开。

如果您不介意我问的话,为什么要避免使用
#ifdef
?我的目标是用户不需要使用-DHAVE_XXX来编译他的程序。不过,他不需要。自动工具会解决这个问题。除非我误解了你=)谢谢你的评论,我会仔细看看这个。如果我在api.h中包含config.h,我会看到我可以实现我想要的吗?(但通常不建议这样做!?)。除此之外,我仍然不知道如何做,即如果程序.c包含api.h并使用func_xxx(),gcc-c程序.c将失败。回答得好。除了“配置文件并不意味着要安装”,这样做的原因是,如果您的
api.h
可以根据用户配置库的方式进行更改,那么在一个系统上运行良好的程序可能无法在另一个系统上编译(或者,如果通过包管理器将其作为二进制包安装,则可能会崩溃!)嗯,那是真的,但我认为这是一个折衷。标准的解决方案是,好的。在不依赖于配置的情况下,您应该执行更复杂的机器操作,例如在生成时,不使用#ifdef,从api.h.in生成api.h文件的机器。你可以通过替换autoconf变量或类似的方法来实现这一点,但我不知道这个主意有多好。谢谢你的回答,我很感激你的回答,它将我的API与用户代码完全解耦。另一个不太理想的解决方案是使用“但我不知道这个主意有多好”中的ax\u prefix\u config\u h.m4宏创建一个可安装的配置文件。这不是一个好主意,例如,如果我使用编译器a构建库,而用户使用编译器B编译他的代码,那么他的代码可能会中断,因为api.h是专门为编译器a构建的(例如,api.h可能使用编译器a的非标准扩展)。