如何在C中字符串化表达式

And*_*rew 8 c

有没有办法在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)

NB

为简单起见,我省略了错误控制和free.

  • 放弃"据我所知"位.预处理器在编译器之前运行.表达式在运行时以语义方式计算(尽管编译器应在编译时将其优化为单个常量). (2认同)
  • OBS:10个字节是不够的.你需要至少12个,计算零终结符和前导 - 负整数. (2认同)

And*_*w Y 5

您可能不会喜欢表达式的格式,是的,它可能的,但是以一种非常折衷的方式 - 您需要创建一个由预处理器"运行"的单独的函数语言.证据:

$ 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编译器.

当然,我非常怀疑这是你在实践中曾经使用过的东西,而且它对预处理器的滥用非常紧张,但我认为它是一个非常发人深省的黑客.(是的,没有像这样的奇异的理论曲折,这是不可能的).