问题描述
我不确定该如何措辞,但是我正在用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
另一种实现方法是对两个版本都实现一个功能。如果不要求附加功能,则该功能将不执行任何操作或返回错误代码或显示错误消息。