我面临一个棘手的问题。我想根据编译器命令行伪造一个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]
.