【问题标题】:What does "##" do in C? [duplicate]“##”在C语言中是做什么的? [复制]
【发布时间】:2012-09-30 05:15:53
【问题描述】:

可能重复:
C preprocessor and concatenation
C preprocessor # and ## operators

在搜索我使用(在嵌入式项目上)开发的操作系统的一些 C 代码时,我发现了以下定义语句:

#define concatn(s1, s2) s1 ## s2

我从未见过“##”运算符,经过一番认真的谷歌搜索后,我找不到任何对它的引用。这是怎么回事?

我搜索了操作系统源代码,但找不到任何对字符串“##”的引用,该字符串被定义为某种其他形式的 C 运算符。这是标准 C,还是可能/可能是编译器的一个特性?

【问题讨论】:

  • 在预处理器中连接
  • "## Operator C" -> I'm Feeling Lucky 你不会经常使用“手气不错”的按钮,但在这里可以正常使用。
  • 好吧,我不知道我的 Google 上下文是怎么回事,但是当我搜索时,Google 倾向于忽略特殊字符。我尝试的每次搜索都将结果返回到通用的 C 运算符列表——其中没有一个包含“##”运算符。事实上,我打开了许多这样的页面并在页面内进行了搜索——在任何地方都没有找到。
  • @H2CO3:您所链接的问题并不是涵盖这个问题的先例——它更多地是关于一个技术细节,而不是关于 ## 运算符的一般性问题。
  • 是的,我读过这个问题——这不是重复的,当然也不是“精确”的。

标签: c operators c-preprocessor


【解决方案1】:

它是预处理器的一部分,连接标记,concatn(x,y)xy 替换。

【讨论】:

    【解决方案2】:

    这是标准的 c 预处理器字符串连接运算符

    【讨论】:

      【解决方案3】:

      它用于连接两个标记(在本例中为 s1 和 s2)。更多详情here。它是标准的 C 预处理,因此每个符合标准的编译器都应该处理它。

      例如:

      concatn(a_, b) = 1;
      

      将宏到:

      a_b = 1;
      

      【讨论】:

        【解决方案4】:

        ##是C语言中的token pasteing operator,用于连接两个token。

        例子:

        #define PASTE(front, back) front ## back
        

        然后

        PASTE(name, 1)    
        

        创建令牌name1

        【讨论】:

          猜你喜欢
          • 2016-05-03
          • 1970-01-01
          • 2013-03-11
          • 2014-05-22
          • 1970-01-01
          • 2014-02-01
          • 2013-07-31
          • 2022-01-08
          • 2015-05-20
          相关资源
          最近更新 更多