如何将宏从C中的头文件传递到源文件?

问题描述

我不确定该如何措辞,但是我正在用C创建一个小型库,我想拥有可选的#includes作为附加功能。例如,在library.h中:

#ifndef __LIBRARY_H__
#define __LIBRARY_H__

int addNumber(int a,int b);

#ifdef __ADDITIONAL_FEATURE__
//Additional feature if __ADDITIONAL_FEATURE__ is defined
int subtractNumber(int a,int b);

#endif

#endif

在library.c中:

#include <stdio.h>
#include "library.h"
int addNumber(int a,int b) {
    return a + b;
}
#ifdef __ADDITIONAL_FEATURE__
int subtractNumber(int a,int b) {
    return a - b;
}
#endif

在测试程序中,我做了

#include <stdio.h>
#define __ADDITIONAL_FEATURE__
#include "library.h"

int main(void) {
    printf("%d",subtractNumber(1,2));
}

但是,当我编译它时,它说减去数字是一个未解析的外部符号。但是,如果我在library.c中定义 ADDITIONAL_FEATURE ,那么它就可以工作。那么,如何将 ADDITIONAL_FEATURE 宏传递给library.c?还是有另一种方法

谢谢

解决方法

要查看您的问题,请重新考虑您的编译过程: 您可以这样编译您的库:

gcc library.c -o library.o #See,you didn't define __ADDITIONAL_FEATURE__?

如果要查看目标文件中的功能,则只会看到addNumber,因为尚未定义__ADDITIONAL_FEATURE__ ==>函数subtractNumber被预处理器剥离了。

然后,在测试程序中,定义 ADDITIONAL_FEATURE ,并使用

进行编译
gcc -o executable test.c library.o

您引用了subtractNumber,但由于您没有使用__ADDITIONAL_FEATURE__来编译library.c,所以它不存在。

因此链接失败。

,

我认为一种解决方案是在编译命令中这样定义宏,而不是gcc test.c library.c使用gcc test.c library.c -D __ADDITIONAL_FEATURE__并从test.c中删除define

,

另一种实现方法是对两个版本都实现一个功能。如果不要求附加功能,则该功能将不执行任何操作或返回错误代码或显示错误消息。