加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

“## b”在C中的含义是什么?

发布时间:2020-12-16 10:10:37 所属栏目:百科 来源:网络整理
导读:参见英文答案 Reading Zend Engine API code: What does ## (double hash) mean?????????????????????????????????????3个 来自usbtiny / defs.h(ATTiny控制器的AVR libc USB代码): #define CAT2(a,b) CAT2EXP(a,b)#define CAT2EXP(a,b) a ## b#define CAT3
参见英文答案 > Reading Zend Engine API code: What does ## (double hash) mean?????????????????????????????????????3个
来自usbtiny / defs.h(ATTiny控制器的AVR libc USB代码):

#define CAT2(a,b)               CAT2EXP(a,b)
#define CAT2EXP(a,b)            a ## b
#define CAT3(a,b,c)             CAT3EXP(a,c)
#define CAT3EXP(a,c)          a ## b ## c

什么是##运算符?我已经这样做了30年了,我很难过.谷歌没有帮助,因为我不认为他们正在索引这些字符.

解决方法

宏定义中的##符号表示串联.

所以

#define concat(a,b) a ## b

意思是

concat (pri,ntf) ("hello worldn");

后处理到

printf("hello worldn");

文件here.

同样有用的是stringify运算符(#),不应混淆它.

一个测试:

/* test with
 *    gcc -E test.c
 * having removed the #include lines for easier to read output
 */

#include <stdio.h>
#include <stdlib.h>

#define concat(a,b) a ## b

int
main (int argc,char **argv)
{
  concat (pri,ntf) ("Hello worldn");
  exit (0);
}

为什么额外的间接水平?正如Deduplicator在评论中指出他的答案如下,没有它,它将连接指定的字面术语,而不是宏替换术语.这种陷阱的有用清单是here.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读