有没有办法在c中进行字符串化之前评估表达式?
例:
#define stringify(x) #x
...
const char * thestring = stringify( 10 * 50 );
Run Code Online (Sandbox Code Playgroud)
问题是我想得到
const char * thestring = "500";
Run Code Online (Sandbox Code Playgroud)
而不是:
const char * thestring = "10 * 50";
Run Code Online (Sandbox Code Playgroud)
可以这样做吗?
dfa*_*dfa 10
C预处理器不能这样做,所以请snprintf改用:
char *stringify(int n) {
char *res = malloc(12);
snprintf(res, 12, "%d", n);
return res;
}
Run Code Online (Sandbox Code Playgroud)
const char *thestring = stringify(10 * 50);
Run Code Online (Sandbox Code Playgroud)
为简单起见,我省略了错误控制和free.
您可能不会喜欢表达式的格式,是的,它是可能的,但是以一种非常折衷的方式 - 您需要创建一个由预处理器"运行"的单独的函数语言.证据:
$ cvs -d:pserver:anonymous@chaos-pp.cvs.sourceforge.net:/cvsroot/chaos-pp login
$ cvs -z3 -d:pserver:anonymous@chaos-pp.cvs.sourceforge.net:/cvsroot/chaos-pp co -P chaos-pp
$ cvs -z3 -d:pserver:anonymous@chaos-pp.cvs.sourceforge.net:/cvsroot/chaos-pp co -P order-pp
$ cd order-pp/example
$ grep -A 6 'int main' fibonacci.c
int main(void) {
printf
("The 500th Fibonacci number is "
ORDER_PP(8stringize(8to_lit(8fib(8nat(5,0,0)))))
".\n");
return 0;
}
$ cpp -I../inc fibonacci.c 2>/dev/null | grep -A 6 'int main'
int main(void) {
printf
("The 500th Fibonacci number is "
"139423224561697880139724382870407283950070256587697307264108962948325571622863290691557658876222521294125"
".\n");
return 0;
}
Run Code Online (Sandbox Code Playgroud)
在这个例子中,我们使用新制作的预处理器运行的纯函数式语言来计算第500个Fibonacci数,然后将其字符串化以提供给C编译器.
当然,我非常怀疑这是你在实践中曾经使用过的东西,而且它对预处理器的滥用非常紧张,但我认为它是一个非常发人深省的黑客.(是的,没有像这样的奇异的理论曲折,这是不可能的).