【问题标题】:Need explanation over the behavior of C++ code需要解释 C++ 代码的行为
【发布时间】:2014-03-02 10:19:09
【问题描述】:

我需要稍微解释一下这个 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 但它返回 9 和 cout&lt;&lt; sizeof(MY_MACRO(SQR(100)))&lt;&lt;endl;

它背后的陷阱是什么?

【问题讨论】:

  • 每个字符被视为一个字节。
  • 查看预处理器的输出(如果您使用的是 g++:g++ -E)。然后你会看到 cout
  • @Rikayan 但是在这里,如果您看到宏会将 100 * 100 替换为 9 (MY_MACRO(n) #n),那么它将是 sizeof(9)
  • @MichaelBrennan 它返回 4
  • 那么你想要将SQR(100)扩展为100 * 100,然后将that变成字符串?

标签: c++ gcc c++11 macros


【解决方案1】:

您没有使用正确的#n 定义。这不是参数的数量。它把它变成一个字符串。

【讨论】:

  • 哦,太好了,它解决了我的查询,并在我的脑海中又产生了 1 个问题。宏对字符串有效吗?像"SQR(100)" 这样会被上面的字符串替换,即100 * 100
  • 你能帮我解决另一个谜团(在上面的评论中说明)吗?
  • 不,宏不会触及字符串文字。如果你想这样做,你必须先修改“字符串”,然后再把它变成文字。
  • 哦,太好了!这解决了我脑海中浮现的问题:)
【解决方案2】:

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

sizeof("SQR(100)");

这将给出 9 作为字符串文字的大小,包括终止 '\0'

#n 会将参数设为字符串,而不是参数的个数

例如:

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

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

【讨论】:

  • 但是SQR(100)不会被100 * 100替换吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-03-15
  • 1970-01-01
  • 2016-09-06
相关资源
最近更新 更多