虽然我读过类似的问题,但似乎没有一个能解决我的问题。
我有一个只有头的实用程序,我们称它为hutil.h
,它包含一个函数,我们称它为hutil_func
。我创建了一个小工具,它有一个头文件,我们称它为tool.h
,还有一个源文件,我们称它为tool.c
。在tool.c
中,我实现了一些使用hutil_func
的“额外功能”,但我不想强制用户在用户不需要额外功能的情况下使用hutil.h
文件。
因此,假设用户有一个main.c
文件,如下所示:
// #include "hutil.h" <-- How to handle if this is removed?
#include "tool.h"
int main(void)
{
a_function_from_tool(); // <-- This can use hutil_func if hutil.h included
return 0;
}
现在,我正在寻找一个解决方案——希望是一个宏在编译时处理这种情况——它将用一个空的
hutil_func
宏替换#define hutil_func()
。提前谢谢!
更新1:
hutil.h
不能包含在tool.c
中,因为这正是我要避免的:如果用户不想使用hutil.h
,则用户不会将其放在tool.c
旁边。更新2:
函数
hutil_func
在a_function_from_tool
内部调用。 最佳答案
尝试使用头来实现这一点似乎是一个糟糕的设计,并且破坏了模块性。
最好将其指定为编译时选项。您的用户可以使用某种配置脚本,也可以直接修改makefile,因此如果他们选择使用此功能,您最终会调用如下内容:
gcc -o tool.o tool.c -c -DUSE_HUTILS
然后,在
tool.c
中,您可以执行以下操作:#ifdef USE_HUTILS
#include "hutils.h"
#endif
...
int a_function_from_tools(void) {
/* Some code */
#ifdef USE_HUTILS
int n = hutil_func();
#else
int n = get_n_some_other_way();
#endif
return n;
}
这样一来,
tool.c
就不依赖于,也不关心main.c
中包含了什么或没有包含什么,这就是它应该是什么。如果它可以为您正在执行的特定代码工作,您可以通过执行以下操作来避免函数本身中的多个条件编译块:
#ifdef USE_HUTILS
#include "hutils.h"
#else
#include "hutils_fake.h"
#endif
其中
hutils_fake.h
包含与hutils.h
相同的接口,但该接口基本上按照您所称的“空#define hutil_func()
宏”的行展开为空。或者,您可以只检查#ifdef USE_HUTILS
本身中的hutils.h
,如果定义了它,则定义真正的功能,如果没有定义,则定义假功能。按照这些思路来提供不同的功能,这些功能可以选择性地编译到应用程序中或从应用程序中编译出来,这是相当正常的。
关于c - 如果包含额外的头文件,该如何处理?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23956906/