【问题标题】:How to execute a single preprocessor directive in a C file如何在 C 文件中执行单个预处理器指令
【发布时间】: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"' &gt; main2.c; cat main.c &gt;&gt; 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


【解决方案1】:

我的尝试使用了预处理器条件代码和字符串连接(事实上,在 C 中你可以使用"abc" "def",它会被视为"abcdef"

#include <stdio.h>

#ifdef V1
#define VERSION "1"
#define VALUE 99
#else
#define VERSION "2"
#define VALUE 66
#endif


int main(void) {
    printf("This file is in version " VERSION " and contains value %d\n", VALUE);
    return 0;
}

打印出来的

>> ~/playground/so$ gcc -DV1 q1.c 
>> ~/playground/so$ ./a.out 
This file is in version 1 and contains value 99
>> ~/playground/so$ gcc -DV2 q1.c 
>> ~/playground/so$ ./a.out 
This file is in version 2 and contains value 66



【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-07-07
    • 1970-01-01
    • 1970-01-01
    • 2023-03-05
    • 1970-01-01
    相关资源
    最近更新 更多