【问题标题】:Preprocessor directive with hash带有哈希的预处理器指令
【发布时间】:2013-05-24 16:33:19
【问题描述】:
#define f(g,g2) g##g2
main()
{
int var12=100;
printf("%d",f(var,12));
}

这段代码给出了输出 100,但是如果实现了预处理器,printf 将被重写为:

printf("%d",var##12);

那么,输出是怎么来的?

【问题讨论】:

  • 实施是什么意思?

标签: c c-preprocessor preprocessor-directive


【解决方案1】:

双重哈希## 是预处理器的token pasting operatorprintf 将被重写为:

printf("%d",var12); // No double-hash

双数字符号或“标记粘贴”运算符 (##),有时称为“合并”运算符,用于类对象宏和类函数宏。它允许将单独的标记连接到单个标记中,因此不能是宏定义中的第一个或最后一个标记。

【讨论】:

  • 这个“token-pasing”操作符是否只用于宏定义或程序中的其他地方?
  • @Ceres111 标记粘贴操作符是由预处理器定义的,因此它在宏之外无效。您可以将它与函数样式和“类对象”宏一起使用,即可以先编写#define MYVAR var##12,然后编写printf("%d",MYVAR);
【解决方案2】:

因为f(var, 12) 被替换为var12,这是您在上面一行中声明和分配的变量的名称。预处理器指令## 将两个参数粘贴在一起。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2014-05-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多