宏中#与##详解

来源:互联网 发布:扫描仪ocr软件 编辑:程序博客网 时间:2024/04/25 23:22

<span style="font-size:18px;">typedef CCLayer* (*NEWTESTFUNC)();#define TESTLAYER_CREATE_FUNC(className) \static CCLayer* create##className() \{ return new className(); }#define CF(className) create##className</span>

对于宏中的#与##是否很蛋疼,哎,其实我也很蛋疼,废话不多说啦,直接开始谈谈我的理解与笔记吧,如果有错请大神指点,我这一枚小菜鸟


#与##在宏定义中的--宏展开

##在宏中定义,是字符连接符
如a##b##c 等同于 "abc"
#在宏开头出现,是表示宏展开的方式不同
#a 等同于"a"
#abc 等同于 "abc"

#include <stdio.h>

#define f(a,b) a##b

#define g(a)   #a

#define h(a) g(a)

int main()

{

        printf("%s\n", h(f(1,2)));   // 12

        printf("%s\n", g(f(1,2))); // f(1,2)

        return 0;

}

宏展开时:

如果宏定义以#开头,不展开参数,直接替换。

故g(f(1,2))--->#f(1,2)--->"f(1,2)";

如果宏定义不以#开头,展开参数,直接替换,由外层向里层,如果碰到的是#开头的宏,不继续往里层展开,往外层展开。由外层向里层,如果碰到的是以非#开头的宏,继续往里层走,直至最里层,开始一层层往外层展开。

故h(f(1,2))--->h(12)--->g(12)---->#12----->"12"。


#include <stdio.h>

#define f(a,b) a##b

#define g(a)   #a

#define h(a) g(a)

int main()

{

        char a = 'a';

        cout<<g(a)<<endl; // a

        cout<<g(g(a))<<endl; // a

        printf("%s\n", h(f(1,2)));   // 12

        printf("%s\n", g(f(1,2))); // f(1,2)

        printf("%s\n", g(h(f(1,2)))); // h(f(1,2))

        printf("%s\n", h(g(f(1,2)))); // "f(1,2)"

        printf("%s\n", h(h(f(1,2)))); // "12"

        system("pause");

        return 0;

}

预处理后的:(在编译选项中添加/EP /P后编译生成的.i文件)

int main()

{

        char a = 'a';

        cout<<"a"<<endl;

        cout<<"g(a)"<<endl;

        printf("%s\n", "12");

        printf("%s\n", "f(1,2)");

        printf("%s\n", "h(f(1,2))");

        printf("%s\n", "\"f(1,2)\"");

        printf("%s\n", "\"12\"");

        system("pause");

        return 0;

}

---------------------------------------------------

宏解析

1.       ##操作符

##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号,它不能出现于宏替代表的开端和末尾。

例:

#define concat(s,t) s##t

#define AAA ABC

concat(A, AA)

将被替换成

ABC

2.       重新扫描和替换

在替换列表中的所有参数替换过之后,预处理器将对结果token序列重新扫描以便对其中的宏再次替换。

当正在替换的宏在其替换列表中发现自身时,就不再对其进行替换。在任何正在嵌套替换的宏的替换过程中遇到正被替



换的宏就对其不再进行替换(防止递归)。

例:

#define ROOT AAA CCC

#define AAA ROOT

ROOT

将被替换成

ROOT CCC

0 0
原创粉丝点击
热门问题 老师的惩罚 人脸识别 我在镇武司摸鱼那些年 重生之率土为王 我在大康的咸鱼生活 盘龙之生命进化 天生仙种 凡人之先天五行 春回大明朝 姑娘不必设防,我是瞎子 苹果id忘记了自动续费怎么办 红米手机小米账号密码忘了怎么办 小米5splus没系统卡米怎么办 注册谷歌账号输入手机好怎么办 谷歌注册电话号码用了太多次怎么办 内存卡用了深度清理的软件怎么办 华为畅享5s密码忘了怎么办 小米5s进水了一直开机关机怎么办 手机菜单键功能键返回键失灵怎么办 小米5s更新系统发热严重怎么办 小米手机4G网速不好怎么办力 红米5 plus开不开机怎么办 小米3s手机触屏部分失灵怎么办 魅族手机屏幕锁密码忘了怎么办 手机没设置魅族账号密码忘了怎么办 魅族手机格式化密码忘了怎么办 魅族手机忘记密码了怎么解锁怎么办 手机设置的应用加密忘记密码怎么办 手机上设置应用加密忘记密码怎么办 魅蓝flyme密码忘了怎么办图片 魅族手机经常自动账号锁屏怎么办 魅族锁定后又不知道密码怎么办 魅族手机锁屏锁定了怎么办 魅族手机已锁定怎么办密码忘了 京东抢到了小米8不发货怎么办 第一次网上预约没有就诊卡号怎么办 京东定金交了未发货怎么办 买了没有预售许可证的房子怎么办 买了没有预售证的房子怎么办 苹果手机发烫容易变3g网怎么办 魅族手机有指纹和密码怎么办刷机 魅族手机指纹解锁密码忘了怎么办 魅蓝5s运存占用太多怎么办 魅蓝e2手机照片被删了怎么办 魅蓝e2不小心删除了照片怎么办 魅蓝3s返回键失灵怎么办 糖猫电话手表屏碎了怎么办 魅蓝手机没下安装包强制更新怎么办 老婆赌博输了30多万现在怎么办啊 红米nt2手机通话声音小怎么办? 微信退出后重新登录忘记密码怎么办