C++笔记之macro

来源:互联网 发布:交换机sfp端口 编辑:程序博客网 时间:2024/06/05 09:42

  macro(宏)感觉很强大,但是又晦涩难懂。

  平时只是用到那些基础的,比如#define XX 之类的,但是如果要阅读其他代码的话就感觉不够用了。

  记得看Imperfect C++中文版的时候,遇到了一个问题,代码大概如下

#define CON(x, y) x##y#define CONNECT(x, y) CON(x, y)
  然后作者说至于为什么这样设计的,请读者自己思考。

  当时一直就搞不懂,为什么会需要间接调用而不是直接就调用,这两个有什么区别吗?问题是什么,我都忘记了。

  后来当再次想起这个问题的时候,我就问了一下某个群的高手,然后给了我一个链接Click here,我研读了一下,然后整理宏的相关部分。

  1.形如#define T(x) #x:

  这个宏替换后变成“x"

  2. 形如#define C(x, y) x##y

  这个替换后成为xy,这里不是“xy"

  3.形如上面的间接调用,这里是一个难点:

  其实当搞明白之后也很简单,就是为了展现出自己原来的模样,没有被认错

  比如:

#define FIVE 5#define STR(x) #x//直接调用#define STRING(x) STR(x)//间接调用//直接调用,其结果为FIVESTR(FIVE);//间接调用,其结果为5STRING(FIVE)
  通过间接调用,如果x和y是宏的话,那么他们就会在进行##操作之前得到替换,所以就被替换成真正的模样了。

 ( If either of the tokens next to an ## is a parameter name, it is replaced by its actual argument before## executes. The actual argument is not macro expanded first。)

  前路漫漫,还是继续走下去吧~

转载请注明原文地址,谢谢~

0 0