【Cocos2dX(2.x)_Lua开发之三】
【Cocos2dX(2.x)_Lua开发之三】在Lua中使用自定义精灵(Lua脚本与自创建类之间的访问)及Lua基础讲解
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi )
转载自【黑米GameDev街区】
原文链接: http://www.himigame.com/lua-game/985.html
☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!
本篇做起来比较累,大家请参考最新篇【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
此篇可能会在最新的cocos2dx版本中出现如下问题:
1
2
|
LUA ERROR : ... 24 F 82 -1230 -41 FE -8 A 04 - C 445 FB 7 D 1 BAB / mtet.app / hello.lua : 35 : error in function 'addChild'. argument #2 is 'MySprite'; 'CCNode' expected. |
最近Himi都没有更新博文了,其实也是犹豫写本cocos2d(x)引擎书籍在做准备,目录的草稿都写好了,目录中包含的大家最感兴趣的cocos2d/x动作编辑器的详细制作流程与源码! 但是遗憾的是Himi还是腾不出时间去写;
放弃去写的另外一个原因就是因为支持我的童鞋门,在7月份就说过要为大家奉上关于cocos2dx-lua的系列教程,但是一直由于时间等问题一再拖到现在,如果Himi真要准备写书估计半年内都基本很难有时间更新博客的,当然也考虑到公司项目,最终放弃;
顺便说一句,关于Himi9个技术群,不论是cocos2d-iphone、cocos2dx、android还是以后陆续公布的Unity3D群,周期性的Himi和管理员们会定期清理(一切都是为了更多想学习的新童鞋考虑),希望大家进群冒泡,积极讨论。好了,废话就不多说了,从今天开始Himi为童鞋们出cocos2dx-lua的系列开发教程,希望大家还一如既往得支持;3Q
Himi 当前开发工具等版本如下:
mac: 10.8 xcode:4.4.1 cocos2dx :cocos2d-2.0-rc2-x-2.0.1
本篇介绍两个知识点: 1. Lua基础 2.在lua脚本中使用我们自定义的精灵类
一:lua基础
关于Lua的其实很早前Himi写过一篇关于cocos2dx-Lua 的基础博文了,但是是cocos2dx 1.x版本的,对于不是很熟悉的童鞋,Himi还是建议去看一看,连接:【iOS-cocos2d-X 游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! Himi以后更新的Lua系列都是基于Cocos2dx 2.x版本的了。
二:在lua脚本中使用我们自定义的精灵类
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite
HSprite.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// // HSprite.h // cocos2dx_lua_tests_by_Himi // // Created by Himi on 12-8-30. // // #ifndef cocos2dx_lua_tests_by_Himi_HSprite_h #define cocos2dx_lua_tests_by_Himi_HSprite_h #include "cocos2d.h" using namespace cocos2d; class HSprite : public cocos2d::CCSprite{ public : static HSprite* createHSprite( const char * _name); void hspriteInit(); }; #endif |
HSprite.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// // HSprite.cpp // cocos2dx_lua_tests_by_Himi // // Created by Himi on 12-8-30. // // #import "HSprite.h" HSprite* HSprite::createHSprite( const char * _name){ HSprite* sp = new HSprite(); if (sp && sp->initWithFile(_name)){ sp->hspriteInit(); sp->autorelease(); return sp; } CC_SAFE_DELETE(sp); return NULL; } void HSprite::hspriteInit(){ CCMessageBox( "create HSprite success" , "Himi_Lua" ); } |
以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)
下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:
然后开始添加我们自定义精灵类,让Lua脚本能认识它;
步骤分为3步:
1. 注册我们的自定义类:
在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:
1
|
tolua_usertype(tolua_S, "HSprite" ); |
如下图所示:
第二步:声明我们自定义类的函数:
搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:
1
2
3
4
|
tolua_cclass(tolua_S, "HSprite" , "HSprite" , "CCSprite" , NULL); tolua_beginmodule(tolua_S, "HSprite" ); tolua_function(tolua_S, "createHSprite" ,tolua_Himi_HSprite_createHSrpite00); tolua_endmodule(tolua_S); |
如下图:
这里开始解释:
首先定义能让脚本认识的类函数,遵循如下:
a) tolua_cclass(tolua_S, “HSprite”, “HSprite”, “CCSprite”, NULL);
tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S
后两个参数:是自定义类类名
再往后是继承的父类类名
b)添加参数开始声明:
tolua_beginmodule(tolua_S,”HSprite”);
c) 添加自定类函数:
tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);
第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数
注意,这里有多个函数,可以继续写;
d) 结束自定义函数:
tolua_endmodule(tolua_S);
第三步:实现我们的脚本之间转换函数 tolua_Himi_HSprite_createHSrpite00
实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/* method: create of class HSprite */ #ifndef TOLUA_DISABLE_tolua_Himi_HSprite_createHSrpite00 static int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1, "HSprite" ,0,&tolua_err) || !tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif { const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,0)); { HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName); int nID = (tolua_ret) ? tolua_ret->m_uID : -1; int * pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, ( void *)tolua_ret, "HSprite" ); } } return 1; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S, "#ferror in function 'create'." ,&tolua_err); return 0; #endif } #endif //#ifndef TOLUA_DISABLE |
如下图所示:
这里Himi解释下:
童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,
首先是375~384之间的代码:
1
2
3
4
5
6
7
8
9
10
|
#ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1, "HSprite" ,0,&tolua_err) || !tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif |
这里是对参数类型的判断:
tolua_isusertable 是否为”第三个参数”自定义类型
tolua_isstring 是否为字符串类型
tolua_isnoobj 结束(没有参数的判断)
然后是386~392之间的代码段:
1
2
3
4
5
6
7
|
const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,0)); { HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName); int nID = (tolua_ret) ? tolua_ret->m_uID : -1; int * pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, ( void *)tolua_ret, "HSprite" ); } |
这里是对脚本代码的解析从而调用的自定义创建的函数
最后我们修改 hello2.lua 脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件)
在脚本最后”– run”下代码修改如下:
1
2
3
4
5
6
|
-- run local sceneGame = CCScene:create() -- sceneGame:addChild(createLayerFram()) -- sceneGame:addChild(createLayerMenu()) sceneGame:addChild(createHimiLayer()) CCDirector:sharedDirector():runWithScene(sceneGame) |
这里Himi注视了另个layer的添加,添加了自己的Layer
1
|
sceneGame:addChild(createHimiLayer()) |
然后将Himi自定义方法添加在脚本中,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local function createHimiLayer() local layerH = CCLayer:create() local _font = CCLabelTTF:create( "Himi_(cocos2dx-Lua)教程" , "Arial" ,33) _font:setPosition(230,280) layerH:addChild(_font) --创建自定义类型精灵 local hsprite = HSprite:createHSprite( "himi.png" ) hsprite:setPosition(100,100) hsprite:setScale(1.5) hsprite:setRotation(45) layerH:addChild(hsprite) return layerH end |
创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。
ok,运行后的接图如下:
本站文章均为李华明Himi原创,转载务必在明显处注明:(作者新浪微博:@李华明Himi )
转载自【黑米GameDev街区】
原文链接: http://www.himigame.com/lua-game/985.html
☞ 点击订阅 ☜ 本博客最新动态!及时将最新博文通知您!
本篇做起来比较累,大家请参考最新篇【COCOS2DX-LUA 脚本开发之四】使用tolua++编译pkg,从而创建自定义类让Lua脚本使用
此篇可能会在最新的cocos2dx版本中出现如下问题:
1
2
|
LUA ERROR : ... 24 F 82 -1230 -41 FE -8 A 04 - C 445 FB 7 D 1 BAB / mtet.app / hello.lua : 35 : error in function 'addChild'. argument #2 is 'MySprite'; 'CCNode' expected. |
最近Himi都没有更新博文了,其实也是犹豫写本cocos2d(x)引擎书籍在做准备,目录的草稿都写好了,目录中包含的大家最感兴趣的cocos2d/x动作编辑器的详细制作流程与源码! 但是遗憾的是Himi还是腾不出时间去写;
放弃去写的另外一个原因就是因为支持我的童鞋门,在7月份就说过要为大家奉上关于cocos2dx-lua的系列教程,但是一直由于时间等问题一再拖到现在,如果Himi真要准备写书估计半年内都基本很难有时间更新博客的,当然也考虑到公司项目,最终放弃;
顺便说一句,关于Himi9个技术群,不论是cocos2d-iphone、cocos2dx、android还是以后陆续公布的Unity3D群,周期性的Himi和管理员们会定期清理(一切都是为了更多想学习的新童鞋考虑),希望大家进群冒泡,积极讨论。好了,废话就不多说了,从今天开始Himi为童鞋们出cocos2dx-lua的系列开发教程,希望大家还一如既往得支持;3Q
Himi 当前开发工具等版本如下:
mac: 10.8 xcode:4.4.1 cocos2dx :cocos2d-2.0-rc2-x-2.0.1
本篇介绍两个知识点: 1. Lua基础 2.在lua脚本中使用我们自定义的精灵类
一:lua基础
关于Lua的其实很早前Himi写过一篇关于cocos2dx-Lua 的基础博文了,但是是cocos2dx 1.x版本的,对于不是很熟悉的童鞋,Himi还是建议去看一看,连接:【iOS-cocos2d-X 游戏开发之八】在Cocos2dX游戏中使用Lua脚本进行游戏开发(基础篇)并介绍脚本在游戏中详细用途! Himi以后更新的Lua系列都是基于Cocos2dx 2.x版本的了。
二:在lua脚本中使用我们自定义的精灵类
首先创建cocos2dx-lua项目,然后在项目中添加我们的自定义精灵类:这里Himi类名为:HSprite
HSprite.h:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
// // HSprite.h // cocos2dx_lua_tests_by_Himi // // Created by Himi on 12-8-30. // // #ifndef cocos2dx_lua_tests_by_Himi_HSprite_h #define cocos2dx_lua_tests_by_Himi_HSprite_h #include "cocos2d.h" using namespace cocos2d; class HSprite : public cocos2d::CCSprite{ public : static HSprite* createHSprite( const char * _name); void hspriteInit(); }; #endif |
HSprite.cpp:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
|
// // HSprite.cpp // cocos2dx_lua_tests_by_Himi // // Created by Himi on 12-8-30. // // #import "HSprite.h" HSprite* HSprite::createHSprite( const char * _name){ HSprite* sp = new HSprite(); if (sp && sp->initWithFile(_name)){ sp->hspriteInit(); sp->autorelease(); return sp; } CC_SAFE_DELETE(sp); return NULL; } void HSprite::hspriteInit(){ CCMessageBox( "create HSprite success" , "Himi_Lua" ); } |
以上代码不做解释了,很简单,继承CCSprite,添加一个自动释放的创建函数(createHSprite)以及一个自定义初始化函数(hspriteInit)
下面我们打开LuaCocos2d.cpp 类,这个类在项目的 libs/lua/cocos2dx_support目录下,如下图:
然后开始添加我们自定义精灵类,让Lua脚本能认识它;
步骤分为3步:
1. 注册我们的自定义类:
在LuaCocos2d.cpp类中搜索“tolua_reg_types”这个函数,然后在其中进行注册:
1
|
tolua_usertype(tolua_S, "HSprite" ); |
如下图所示:
第二步:声明我们自定义类的函数:
搜索“tolua_Cocos2d_open”这个函数,然后在其中添加如下代码:
1
2
3
4
|
tolua_cclass(tolua_S, "HSprite" , "HSprite" , "CCSprite" , NULL); tolua_beginmodule(tolua_S, "HSprite" ); tolua_function(tolua_S, "createHSprite" ,tolua_Himi_HSprite_createHSrpite00); tolua_endmodule(tolua_S); |
如下图:
这里开始解释:
首先定义能让脚本认识的类函数,遵循如下:
a) tolua_cclass(tolua_S, “HSprite”, “HSprite”, “CCSprite”, NULL);
tolua_cclass声明哪个类函数,第一个状态值默认:tolua_S
后两个参数:是自定义类类名
再往后是继承的父类类名
b)添加参数开始声明:
tolua_beginmodule(tolua_S,”HSprite”);
c) 添加自定类函数:
tolua_function(tolua_S,”createHSprite”,tolua_Himi_HSprite_createHSrpite00);
第一个参数默认,第二个参数自定义类名,第三个:实现脚本与自定义类之间的转换实现函数
注意,这里有多个函数,可以继续写;
d) 结束自定义函数:
tolua_endmodule(tolua_S);
第三步:实现我们的脚本之间转换函数 tolua_Himi_HSprite_createHSrpite00
实现如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
|
/* method: create of class HSprite */ #ifndef TOLUA_DISABLE_tolua_Himi_HSprite_createHSrpite00 static int tolua_Himi_HSprite_createHSrpite00(lua_State* tolua_S) { #ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1, "HSprite" ,0,&tolua_err) || !tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif { const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,0)); { HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName); int nID = (tolua_ret) ? tolua_ret->m_uID : -1; int * pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, ( void *)tolua_ret, "HSprite" ); } } return 1; #ifndef TOLUA_RELEASE tolua_lerror: tolua_error(tolua_S, "#ferror in function 'create'." ,&tolua_err); return 0; #endif } #endif //#ifndef TOLUA_DISABLE |
如下图所示:
这里Himi解释下:
童鞋们可以从第 384行的 #endif 把这个实现函数分为两部分来看,
首先是375~384之间的代码:
1
2
3
4
5
6
7
8
9
10
|
#ifndef TOLUA_RELEASE tolua_Error tolua_err; if ( !tolua_isusertable(tolua_S,1, "HSprite" ,0,&tolua_err) || !tolua_isstring(tolua_S,2,0,&tolua_err) || !tolua_isnoobj(tolua_S,3,&tolua_err) ) goto tolua_lerror; else #endif |
这里是对参数类型的判断:
tolua_isusertable 是否为”第三个参数”自定义类型
tolua_isstring 是否为字符串类型
tolua_isnoobj 结束(没有参数的判断)
然后是386~392之间的代码段:
1
2
3
4
5
6
7
|
const char * pszFileName = (( const char *) tolua_tostring(tolua_S,2,0)); { HSprite* tolua_ret = (HSprite*) HSprite::createHSprite(pszFileName); int nID = (tolua_ret) ? tolua_ret->m_uID : -1; int * pLuaID = (tolua_ret) ? &tolua_ret->m_nLuaID : NULL; tolua_pushusertype_ccobject(tolua_S, nID, pLuaID, ( void *)tolua_ret, "HSprite" ); } |
这里是对脚本代码的解析从而调用的自定义创建的函数
最后我们修改 hello2.lua 脚本中的代码:(创建cocos2dx-lua项目默认Resources下自带的文件)
在脚本最后”– run”下代码修改如下:
1
2
3
4
5
6
|
-- run local sceneGame = CCScene:create() -- sceneGame:addChild(createLayerFram()) -- sceneGame:addChild(createLayerMenu()) sceneGame:addChild(createHimiLayer()) CCDirector:sharedDirector():runWithScene(sceneGame) |
这里Himi注视了另个layer的添加,添加了自己的Layer
1
|
sceneGame:addChild(createHimiLayer()) |
然后将Himi自定义方法添加在脚本中,代码如下:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
|
local function createHimiLayer() local layerH = CCLayer:create() local _font = CCLabelTTF:create( "Himi_(cocos2dx-Lua)教程" , "Arial" ,33) _font:setPosition(230,280) layerH:addChild(_font) --创建自定义类型精灵 local hsprite = HSprite:createHSprite( "himi.png" ) hsprite:setPosition(100,100) hsprite:setScale(1.5) hsprite:setRotation(45) layerH:addChild(hsprite) return layerH end |
创建自己定义的精灵,然后进行调用缩放,旋转,设置坐标函数。
ok,运行后的接图如下:
【Cocos2dX(2.x)_Lua开发之三】的更多相关文章
- MVC5 网站开发之三 数据存储层功能实现
数据存储层在项目Ninesky.DataLibrary中实现,整个项目只有一个类Repository. 目录 奔跑吧,代码小哥! MVC5网站开发之一 总体概述 MVC5 网站开发之二 创建项目 ...
- Windows7上搭建Cocos2d-x 3.1.1开发环境
前言 现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握Cocos2d-x 3.0.首先就从开发环境的大家说起吧. 开发工具 ...
- Chrome扩展开发之三——Chrome扩展中的数据本地存储和下载
目录: 0.Chrome扩展开发(Gmail附件管理助手)系列之〇——概述 1.Chrome扩展开发之一——Chrome扩展的文件结构 2.Chrome扩展开发之二——Chrome扩展中脚本的运行机制 ...
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面
cocos2d-x 3.0游戏开发xcode5帅印博客教学 003.[HoldTail]游戏世界以及背景画面 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...
- [置顶] cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动
cocos2d-x 3.0游戏开发xcode5帅印博客教学 004.[HoldTail]主角的上下飞行跟移动 写给大家的前言,在学习cocos2d-x的时候自己走了很多的弯路,也遇到了很多很多问题,不 ...
- Cocos2d-x 3.1.1开发环境
Windows7上搭建Cocos2d-x 3.1.1开发环境 前言 现在,越来越多的公司采用Cocos2d-x 3.0来开发游戏了,但是现在这样的文章并不多,所以打算写一系列来帮助初学者快速掌握C ...
- 多线程开发之三 GCD
NSThread.NSOperation.GCD 总结: 无论使用哪种方法进行多线程开发,每个线程启动后并不一定立即执行相应的操作,具体什么时候由系统调度(CPU 空闲时就会执行) 更新 UI 应该在 ...
- osx下配置Cocos2d-x 3.x Android开发环境
配置前需要准备的 首先需要看一下官网文档 http://www.cocos.com/doc/article/index?type=cocos2d-x&url=/doc/cocos-docs-m ...
- cocos2d-x 2.2 wp8 开发手记
最近有朋友问我有没有搞过 wp8 的cocos2dx开发 回复:额,没有.(感觉超没面子对方是妹子 = = ) 本着帮妹子试试的态度 就开始了 今天工作 第一我印象中wp8 开发必须要用 vs20 ...
随机推荐
- (20)C#泛型
泛型的定义:通过参数化类型来实现在同一份代码上操作多种数据类型.泛型编程时一种编程范式,它利用“参数化类型”将类型抽象化,从而实现更为灵活的复用. 优点: 1.省去了拆箱.装箱 2.提高安全性 3. ...
- Python_Tips[1] -> 利用 Python 的字典实现 Switch 功能
利用 Python 的字典实现 Switch 功能 Python是没有switch语句的,当遇到需要实现switch语句的功能时,一般可以用if/else进行代替,但是还有一种更加简洁的实现方法,利用 ...
- 818D - Multicolored Cars
818D - Multicolored Cars 题意 在 1 到 n 时刻,有 n 量有颜色的车通过,用数字表示颜色,Alice 选择一个颜色A,要求 Bob 选择一个颜色B,使得对于任意时刻 cn ...
- UVA——442 Matrix Chain Multiplication
442 Matrix Chain MultiplicationSuppose you have to evaluate an expression like A*B*C*D*E where A,B,C ...
- schema get_ddl
select dbms_metadata.get_ddl('INDEX','INDEX_CC_TAXID','CACS9DBSIT1') from dual; select dbms_metadata ...
- [POI2014]Supercomputer
题目大意: 给定一个$n(n\le10^6)$个结点的有根树,从根结点开始染色.每次可以染和已染色结点相邻的任意$k$个结点.$q(q\le10^6)$组询问,每次给定$k$,问至少需要染几次? 思路 ...
- centos安装postgresql-10及操作
安装postgresql: Linux启动: service postgresql start 创建用户: createuser username 创建数据库: createdb dbname -O ...
- Ubuntu system zabbix-server-3.x install documentation
Installing repository configuration package wget http://repo.zabbix.com/zabbix/3.0/ubuntu/pool/main/ ...
- C语言:宽字符集操作函数
C语言:宽字符集操作函数 (unicode编码) 字符分类: 宽字符函数普通C函数描述 iswalnum() isalnum() 测试字符是否为数字或字母 iswalpha() isalpha() 测 ...
- boost/config.hpp文件详解
简要概述 今天突发奇想想看一下boost/config.hpp的内部实现,以及他有哪些功能. 这个头文件都有一个类似的结构,先包含一个头文件,假设为头文件1,然后包含这个头文 件中定义的宏.对于头文件 ...