C/C++ 中 int 的字符串化

Stringification of int in C/C++

根据我对字符串化的了解,下面的代码应该输出 100。 vstr(s) 应该用值 100 扩展,然后 str(s) 得到 100 并且它应该 return 字符串“100”。但是,它会输出 "a"。是什么原因?但是,如果我用宏定义的常量 foo 调用,那么它会输出“100”。为什么?

#include<stdio.h>
#define vstr(s) str(s)
#define str(s) #s
#define foo 100
int main()
{
    int a = 100;
    puts(vstr(a));
    puts(vstr(foo));
    return 0;
}

由于 vstr 已经过预处理,行

puts(vstr(a));

翻译为:

puts("a");

变量 a 的值在该行中没有任何作用。您可以删除行

int a = 100;

程序的行为相同。

字符串化是将某物转换为字符串的过程。你的宏字符串化了什么?

实际上是变量的名称本身,这是在编译时完成的。

如果你想在执行时进行字符串化然后打印变量的值,那么你必须在 C 或 [=11 中使用类似 printf("%\n",v); 的东西=] 在 C++ 中。

预处理器宏与函数不同,它不会在运行时扩展参数并查看值,而是在预处理阶段(编译之前,所以它甚至不知道变量依赖)。

在这种情况下,您已将宏 a 传递给 stringify,它确实这样做了。预处理器不关心 a 也是一个变量的名称。

# 字符串化运算符是预处理器的一部分。它是在编译时评估的。它无法在执行时获取变量的值,然后以某种方式神奇地将其转换为编译时已知的值。

如果你想在执行时将一个执行时变量转换成一个字符串,你需要使用类似std::to_string的函数。

原因是预处理器对传递给它们的令牌进行操作,而不是对与这些令牌关联的值进行操作。

#include <stdio.h>

#define vstr(s) str(s)
#define str(s) #s

int main()
{
    puts(vstr(10+10));
    return 0;
}

输出: 10+10