Jim*_*hen 2 c stringification c-preprocessor
我面临一个棘手的问题.我想根据编译器命令行伪造一个C源文件内容.例如(使用VC):
如果我使用命令行
cl -c -E -Dfoo=rice test.c
Run Code Online (Sandbox Code Playgroud)
我希望得到实际的 C内容(在预处理之后):
char *s = "rice";
Run Code Online (Sandbox Code Playgroud)
如果我使用命令行
cl -c -E -Dfoo=ball test.c
Run Code Online (Sandbox Code Playgroud)
我希望得到实际的C源文件内容:
char *s = "ball";
Run Code Online (Sandbox Code Playgroud)
现在找到解决方案......
第一次尝试:
// test.c
#define STRNAME(n) #n
char *s = STRNAME(foo);
Run Code Online (Sandbox Code Playgroud)
- 没运气.无论foo被定义为命令行,我总是得到
char *s = "foo"; // Oh no!
Run Code Online (Sandbox Code Playgroud)
第二次尝试(最接近我可以拍照,但仍然很详细):
// test.c
#define STRNAME(n) #n
char *s = foo;
Run Code Online (Sandbox Code Playgroud)
这次,我必须详细更改命令行:
cl -c -E -Dfoo=STRNAME(rice) test.c
Run Code Online (Sandbox Code Playgroud)
现在我明白了
char *s = "rice";
Run Code Online (Sandbox Code Playgroud)
有没有办法帮助我摆脱这种冗长?
顺便说一句:我真的不喜欢在命令参数中引入引号(让它们成为其中的一部分argv[x],因为你无法在Windows CMD和Linux Bash上可靠且可移植地编写这样的命令行 - 我想.
在预处理器中需要额外的间接级别才能首先扩展宏.就像是:
#define STRNAME1(n) #n
#define STRNAME(n) STRNAME1(n)
char *s = STRNAME(foo);
Run Code Online (Sandbox Code Playgroud)
这是一种相当常见的模式,会导致宏被扩展,然后转换为字符串,而不是仅仅转换为字符串.