如何根据条件仅引入a.h或b.h其中一个头文件?
嘿,这个需求很常见,咱们可以通过条件编译结合编译选项来实现,分两步就能搞定:
1. 用预处理指令控制头文件的选择
首先修改你的main.c,把固定包含两个头文件改成通过宏判断来二选一:
#include<stdio.h> // 靠宏定义决定要包含哪个头文件 #ifdef USE_A #include"a.h" #else #include"b.h" #endif int main() { test(); system("pause"); return 0; }
这里的USE_A是我们自定义的宏——当编译时定义了这个宏,程序就会包含a.h;没定义的话就默认包含b.h。
2. 配合编译命令,只编译对应实现文件
因为a.c和b.c里都有同名的test()函数,如果同时编译两个文件会报链接冲突。所以编译时要根据选择,只编译对应的.c文件:
如果想使用
a.h和a.c的实现,编译命令加-DUSE_A参数:gcc main.c a.c -DUSE_A -o test_from_a运行这个生成的
test_from_a,就会输出Got tested from a.如果想使用
b.h和b.c的实现,直接编译对应的文件即可(默认走else分支):gcc main.c b.c -o test_from_b运行后会输出
Got tested from b.
如果平时编译频繁,还可以写个简单的Makefile来自动化:
# 生成使用a版本的可执行文件 test_a: main.c a.c gcc main.c a.c -DUSE_A -o $@ # 生成使用b版本的可执行文件 test_b: main.c b.c gcc main.c b.c -o $@ # 清理生成的文件 clean: rm -f test_a test_b
之后只需要输入make test_a或make test_b就能快速编译对应版本了。
另外补充下:你原来头文件里的#ifndef是用来防止重复包含的,这个写法没问题,不用改动~
内容的提问来源于stack exchange,提问作者Neri-kun
相关产品推荐
相关产品推荐

