我如何将宏从 C 中的头文件传递到我的源文件?
How would I pass a macro to my source file from the header file in 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));
}
但是当我编译它时,它说 subtractNumber 是一个未解析的外部符号。但是,如果我在 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
中删除定义
另一种方法是为两个版本实现一个功能。如果未请求附加功能,则该功能可以不执行任何操作或 return 错误代码或打印错误消息。
我不确定如何表达这个问题,但我正在用 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));
}
但是当我编译它时,它说 subtractNumber 是一个未解析的外部符号。但是,如果我在 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__
.
因此链接失败。
我认为一个解决方案是在这样的编译命令中定义宏,而不是 gcc test.c library.c
使用 gcc test.c library.c -D __ADDITIONAL_FEATURE__
并从 test.c
另一种方法是为两个版本实现一个功能。如果未请求附加功能,则该功能可以不执行任何操作或 return 错误代码或打印错误消息。