需要解释C++代码行为

3
我需要一些关于这段 C++ 代码的解释,以及它如何返回值。
#include<iostream>
using namespace std;
#define MY_MACRO(n) #n
#define SQR(x) x * x
int main()
{
    //cout<<MY_MACRO(SQR(100))<<endl;
    //cout<< sizeof(SQR(100))<<endl;
    cout<< sizeof(MY_MACRO(SQR(100)))<<endl;

    return 0;
}

据我所知,#n返回MY_MACRO(n)中参数的个数。但是如果在此之前使用SQR(100)将被替换为100 * 100(如果我们计算空格,则为9个字符)。但现在sizeof(9)应该打印4,而cout<< sizeof(MY_MACRO(SQR(100)))<<endl;返回9。这背后的原因是什么?

每个字符都被视为一个字节。 - HelloWorld123456789
查看预处理器的输出(如果您使用的是g ++:g ++ -E)。然后您将看到cout << sizeof(“SQR(100)”)<< endl; - user861537
@Rikayan 但是在这里,如果您看到宏,它将把100 * 100替换为9(MY_MACRO(n) #n),因此它将是sizeof(9)。 - Saurabh Sharma
@MichaelBrennan 它返回4。 - Saurabh Sharma
所以你想要的是首先将SQR(100)扩展到100 * 100,然后将其转换为字符串? - CompuChip
2个回答

5

您没有使用正确的#n定义。它不是参数的数量。它将其转换为字符串。


哦,太好了,那解决了我的问题,但又在我脑海中产生了一个问题... 宏能用于字符串吗?比如 "SQR(100)",它会被上面的字符串替换,即 100 * 100 吗? - Saurabh Sharma
你能帮我解决另一个困扰我的谜题吗?(以上评论中提到) - Saurabh Sharma
不,宏不会影响字符串字面量。如果你想这样做,你需要先修改“字符串”,然后再将其变成字面量。 - Mario
好的,太棒了!这解决了我脑海中浮现的问题 :) - Saurabh Sharma

5

宏替换后,您的代码将被转换为:

sizeof("SQR(100)");

这将给出包括终止符'\0'在内的字符串字面量的大小为9。

#n会使参数变成字符串,而不是参数的数量。

例如:

#define display( n ) printf( "Result" #n " = %d", Result##n )
int Result99 = 78;

display( 99 ) ; // Will output -> Result99 = 78

但是SQR(100)不会被替换为100 * 100吗? - Saurabh Sharma

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接