【问题标题】:Decipherment of preprocessor statement预处理器语句的解密
【发布时间】:2011-01-17 14:21:42
【问题描述】:

有人可以帮我破译以下内容吗 预处理器语句。

#define ALLOC(x,y)     x _##y; x* y = &_##y;

我知道这里已经为 x 类型的某个变量 y 分配了一些内存。 但我不确定上面语句中## 的目的是什么。如果有人可以帮助我,那就太好了。

【问题讨论】:

  • 你知道你可以运行预处理器来看看它是如何处理它的吗?我知道理解起来很好,但是一旦你理解并用具体的东西来测试它,那么预处理器就可以独立运行了。

标签: c-preprocessor string-concatenation stringification


【解决方案1】:

【讨论】:

    【解决方案2】:

    当您需要从两个(或更多)单独的标记中生成一个标记时,使用标记粘贴运算符 (##)。

    没有它,即

    #define ALLOC(x,y) x _y; x* y = &_y;
    
    ALLOC(a,b)
    

    将扩展为:

    a _y; a* b = &_y;
    

    因为预处理器知道用 b 替换 y 但 _y 完全是另一个标记。

    使用## 运算符(即您的示例)

    ALLOC(a,b)
    

    将扩展为:

    a _b; a* b = &_b;
    

    ## 连接令牌_ 和令牌b 形成令牌_b

    【讨论】:

      【解决方案3】:

      一种用法如

      ALLOC(int, integer)
      

      将在调用宏的地方创建以下代码:

      int  _integer;
      int* integer = &_integer;
      

      【讨论】:

      • 或者,用英语,在堆栈上“分配”一个x类型的对象,并让y指向它。
      【解决方案4】:

      如果我没记错的话## 表示连接“字符串本身”。

      您的案例示例 ALLOC(int,var2) == > int_var2; int* var2 = &_var2

      【讨论】:

        猜你喜欢
        • 2010-09-22
        • 2016-04-09
        • 1970-01-01
        • 2013-03-30
        • 1970-01-01
        • 2012-07-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多