C/C++中int的严格化

Stringification of int in C/C++

本文关键字:int C++      更新时间:2023-10-16

根据我对字符串化的了解,下面的代码应该输出100。vstr(s)应该用值100展开,然后str(s)得到100,它应该返回字符串"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;
}

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

#include <stdio.h>
#define vstr(s) str(s)
#define str(s) #s
int main()
{
    puts(vstr(10+10));
    return 0;
}

输出:10+10

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

如果要在执行时将执行时间变量转换为字符串,则需要使用类似std::to_string的函数。

由于vstr经过预处理

puts(vstr(a));

翻译为:

puts("a");

变量a的值在该行中不起作用。您可以删除线路

int a = 100;

并且程序的行为将完全相同。

字符串化是将某些东西转换为字符串的过程。你的宏字符串是什么?

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

如果要字符串化,然后在执行时打印变量的值,则必须使用类似于C中的printf("%n",v);或C++中的cout << v << endl;的内容。

预处理器宏与函数不是一回事,它不会在运行时展开参数并查看值,而是在预处理阶段(即编译之前,因此它甚至不知道变量的依赖关系)对其进行处理。

在本例中,您已经将宏a传递给stringify,它就是这样做的。预处理器并不关心a也是一个变量的名称。