【发布时间】:2022-07-12 22:12:02
【问题描述】:
我有一个 main.c 文件,其中包含一个或多个定义的预处理器宏:
#include <stdio.h>
#define VALUE 12
int main(void) {
printf("This file is in version %s and contains value %d\n", VERSION, VALUE);
return 0;
}
我想导出一个main2.c 文件,其中仅将#define VERSION "1.0" 应用于原始源文件。
我尝试了什么:
-
gcc -DVERSION=\"1.0\" -E将应用所有预处理器指令,而不是我想要的单个指令 -
sed 's/VERSION/\"1.0\"/g'可能会替换更多,如果我需要多个指令,则需要更多工作 -
cppp是一个不错的工具,但可能会大量更改源文件。仅支持带数值的简单定义
有什么方法可以只使用 gcc 执行部分预处理器指令?
【问题讨论】:
-
最简单的方法可能是
echo '#define VERSION "1.0"' > main2.c; cat main.c >> main2.c,它只是在开头添加#define VERSION "1.0" -
sed方法看起来很适合我(如果我有实际需要它的限制)。如果您担心VERSION可能在程序中出现多次,您可以在单独的头文件中定义它并仅处理它,然后将其包含到您的main中。 -
为什么修改一些make文件比修改一个实际的源文件“更容易”?为什么不能将#define 放在它自己的文件中?
-
你是对的;但我一直在寻找真正“隐藏”原始变量的东西。事实是这不是一个真正的版本号,而是一个函数名,我希望最终的 .c 文件看起来不错,没有很长的 MACRO_NAME 无处不在:)
-
那么
sed或类似名称是您唯一的朋友。同样,如果你害怕有歧义,你可以用VERY@@LONG@@MACRO@@NAME行替换“非常长的 MACRO_NAME”——这在 C 代码中是不合法的,但因为你要替换它来生成实际的源代码,所以你不应该关心。
标签: c bash gcc pre-compilation