虽然我读过类似的问题,但似乎没有一个能解决我的问题。
我有一个只有头的实用程序,我们称它为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_funca_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/

10-13 07:01