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
根据我对字符串化的了解,下面的代码应该输出 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