求C++ 代码的解释

fengyoujie 2013-06-19 10:34:14
在学习cocos2d-x的时候,有一段c++代码看不明白,请诸位老师帮忙解释一下。下面是代码。

typedef CCLayer* (*NEWTESTFUNC)();
#define TESTLAYER_CREATE_FUNC(className) \
static CCLayer* create##className() \
{ return new className(); }

...全文
137 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
mujiok2003 2013-06-19
  • 打赏
  • 举报
回复
引用 3 楼 fengyoujie 的回复:
[quote=引用 1 楼 LCL_data 的回复:] typedef CCLayer* (*NEWTESTFUNC)(); 定义NEWTESTFUNC函数指针,返回值是CCLayer*,参数是空 #define TESTLAYER_CREATE_FUNC(className) \ static CCLayer* create##className() \ { return new className(); } \就是连行号,意思是 下面的行接着这行 TESTLAYER_CREATE_FUNC就是声明了一个函数
static CCLayer* create##className() 这个create##是什么意思[/quote] 把create和参数className连接成一个表识符,比如createA
ri_aje 2013-06-19
  • 打赏
  • 举报
回复
引用 3 楼 fengyoujie 的回复:
[quote=引用 1 楼 LCL_data 的回复:] typedef CCLayer* (*NEWTESTFUNC)(); 定义NEWTESTFUNC函数指针,返回值是CCLayer*,参数是空 #define TESTLAYER_CREATE_FUNC(className) \ static CCLayer* create##className() \ { return new className(); } \就是连行号,意思是 下面的行接着这行 TESTLAYER_CREATE_FUNC就是声明了一个函数
static CCLayer* create##className() 这个create##是什么意思[/quote] 编译期链接字符串的,比如 className == MyTestClassT 则生成的函数名叫 createMyTestClassT()
e3internet 2013-06-19
  • 打赏
  • 举报
回复
typedef CCLayer* (*NEWTESTFUNC)(); ->定义一个函数原型 #define TESTLAYER_CREATE_FUNC(className) \ static CCLayer* create##className() \ { return new className(); } ->一个静态函数.创建一class的实例
fengyoujie 2013-06-19
  • 打赏
  • 举报
回复
引用 1 楼 LCL_data 的回复:
typedef CCLayer* (*NEWTESTFUNC)(); 定义NEWTESTFUNC函数指针,返回值是CCLayer*,参数是空 #define TESTLAYER_CREATE_FUNC(className) \ static CCLayer* create##className() \ { return new className(); } \就是连行号,意思是 下面的行接着这行 TESTLAYER_CREATE_FUNC就是声明了一个函数
static CCLayer* create##className() 这个create##是什么意思
十八道胡同 2013-06-19
  • 打赏
  • 举报
回复
1. ##操作符 ##操作符它的作用是在替代表中将其前后的参数连接成为一个预处理符号,它不能出现于宏替代表的开端和末尾。 例: #define concat(s,t) s##t #define AAA ABC concat(A, AA) 将被替换成 ABC
十八道胡同 2013-06-19
  • 打赏
  • 举报
回复
typedef CCLayer* (*NEWTESTFUNC)(); 定义NEWTESTFUNC函数指针,返回值是CCLayer*,参数是空 #define TESTLAYER_CREATE_FUNC(className) \ static CCLayer* create##className() \ { return new className(); } \就是连行号,意思是 下面的行接着这行 TESTLAYER_CREATE_FUNC就是声明了一个函数
赵4老师 2013-06-19
  • 打赏
  • 举报
回复
#与##在宏定义中的--宏展开 #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"。 PS: ##在宏中定义,是字符连接符 如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() { 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

64,318

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧