2

我面临一个棘手的问题。我想根据编译器命令行伪造一个C源文件内容。例如(使用 VC):

如果我使用命令行

cl -c -E -Dfoo=rice test.c

我希望获得实际的 C内容(预处理后):

char *s = "rice";

如果我使用命令行

cl -c -E -Dfoo=ball test.c

我希望获得实际的C源文件内容:

char *s = "ball";

现在正在寻找解决方案...

第一次尝试:

// test.c
#define STRNAME(n) #n
char *s = STRNAME(foo);

- 没运气。无论 foo 在命令行上定义什么,我总是得到

char *s = "foo"; // Oh no!

第二次尝试(我能想象的最接近,但仍然很冗长):

// test.c
#define STRNAME(n) #n
char *s = foo;

这一次,我必须详细地更改我的命令行:

cl -c -E -Dfoo=STRNAME(rice) test.c

现在我明白了

 char *s = "rice";

有没有办法帮助我摆脱这种冗长的状态?

顺便说一句:我真的不喜欢在命令参数中引入引号(让它们成为argv[x].

4

2 回答 2

6

您需要在预处理器中增加一层间接来首先扩展您的宏。就像是:

#define STRNAME1(n) #n
#define STRNAME(n) STRNAME1(n)
char *s = STRNAME(foo);

这是一种相当常见的模式,会导致您的宏被扩展然后转换为字符串,而不是仅仅转换为字符串。

于 2012-02-07T14:00:03.180 回答
3

您是否尝试将带引号的字符串传递给-D? 您应该能够通过正确转义引号来做到这一点:

-D'foo="rice"'
于 2012-02-07T14:03:59.397 回答