【问题标题】:What does the # operator do in macros? [duplicate]# 运算符在宏中的作用是什么? [复制]
【发布时间】:2014-02-04 13:50:36
【问题描述】:
#include <stdio.h>

#define foo(x, y) #x #y

int main()
{
    printf("%s\n", foo(k, l));
    return 0;
}

输出:
kl

我知道 ## 会进行连接。从输出看来,# 也进行了连接。 我对么?

如果我是正确的,那么## 运算符和# 运算符有什么区别?

【问题讨论】:

  • 执行 gcc -E yourfile.c 并查看进行了哪些预处理
  • @JensGustedt:您链接了一个副本 :-)
  • @AaronDigulla,是的,我知道,但是副本的副本不一定与原始问题完全相同。我链接的那个实际上几乎相同。

标签: c macros


【解决方案1】:
【解决方案2】:

# 将参数转换为字符串。所以foo(k, l) 变为"k" "l",这与"kl" 相同,因为在C 中,直接相邻的多个字符串文字被视为单个字符串文字。

如果 # 进行连接,您的 printf 调用将变为 printf("%s\n", kl);,这将产生关于未定义 kl 的错误。

【讨论】:

    【解决方案3】:

    ## 连接两个参数,# 引用(“字符串化”)它们。所以编译器看到:

    printf("%s\n", "k" "l");
    

    如果您使用 GCC,请使用 -E 查看预处理器的输出。

    此问题包含有关字符串文字连接的详细信息:Implementation of string literal concatenation in C and C++

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2015-09-06
      • 2017-04-24
      • 2012-03-30
      • 2014-05-09
      • 2016-02-20
      • 2016-07-24
      • 2014-03-07
      相关资源
      最近更新 更多