#define用法总结
2012-07-09 15:02
477 查看
刚开始接触VC++的同学们,估计对这个东西有这莫大的恐惧。这个经常写在添加头文件的地方的奇怪语句。
如果看过mfc那么,那么拿出一些application framework里面的宏,估计会吓死一片。说了这么多只是想说,不明白其用法的人很害怕,但要是知道它,熟悉它,那么你会觉得它很美妙。
进入正题:
#define的个用法:
1:#define MAX 0x18
第一个用法意义就在于定义标识符,这个比较常见而且也比较容易理解。将MAX的地方看做是0x18。
2:#define afx_msg
这个可能不常见,但实际上很常见,在mfc里面经常看到某个消息处理函数的前面就是afx_msg,但是究其根源会发现如上定义,
原来啊,#define可以将标识符定义为空,那么mfc为什么要定义呢,这个是项目规划的问题了。可能以后要在afx_msg后面添加
什么东西呢,但更重要的这种宏可以用于提供附加信息。一个用afx_msg修饰的函数,可以让读者很容易知道这个函数是一个处理消息的函数!且这个用经常用在头文件包含方面,后面会讲。
3:#define MAX(a,b) a>b?a:b
这个就是#define最大的用处了可以说,这个称为定义宏。可以当函数使用。但为什么可以当函数使用呢?就在于#define的根本,
不管他是定义标识符也好,定义宏也好,说本质就是个文本替换。所以有了上面的宏定义。那么你可以写出这样的代码。
#define MAX(a,b) a>b?a:b
void main()
{
int a=1;
int b=2;
int c=MAX(a,b);
}
那么关键的那行代码就在编译的时候被替代成:int c=a>b?a:b;这是?:语法。大家都知道可以得到最大值。
不过呢?实际使用的时候我们采取一个原则,分层加括号原则,上面的宏采用这个原则改写后:
#define MAX(a,b) (a>b?a:b)
为什么要这么写呢?请看下面代码:
int c = a * MAX(a,b);
如果采用一开始的写法,展开如下:
int c = a * a >b?a:b;
看到了,最大值比较的是a*a和b。所以出错了!
但采用分层之后就肯定不会错了,分层加括号方法展开如下:
int c = a * (a > b? a: b);
所以大家以后写宏的时候记得要用分层加括号原则。
4:#define TOSTR(x) #x
其实这也是宏,只不过用来引出几个宏定义中常用的语法。
上面的宏将x变成字符串x。下面是三个常用的:
#define TOSTR(X) #X //TOSTR(xujie)代表:"xujie"
#define ADDPRE(X) add##X //ADDPRE(xujie)代表:addxujie //注意这可不是字符串
#define TOCHAR(X) #@x //TOCHAR(x)代表:'x'
#代表:将宏参数转换成字符串
##代表:将##左右的标识符连接成一个,但不是字符串
#@代表:将宏参数转换成单个字符
5:#define IMPLEMENT_SERIAL(theClass,baseClass) IMPLEMENT_DYMCREATE(theClass,baseClass)/
CObject* PASCAL CreateObject() {/
return cass##theClass}
这是一个三行宏,那么其实语法就一点,#define后面出现的第一个标识符,将代替后面多行代码。同一宏之间的多行代码用/连接在一起。
用上简单的宏语法在加上多行注释,再加上Microsoft那帮疯子,就出现了我们mfc里面精妙绝伦的宏了。
也请注意将#define和typedef做区别,前几个博客已经讲明了。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中
#define BEGIN_INTERFACE_PART(localClass, baseClass) \
&<60;class X##localClass : public baseClass \
本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。
后来问了几个朋友也都不知道。
你知道么?
也许你也不知道~呵呵,最后我还是找到了相关的资料,解读了这个define,还顺便认识了另外两个不常用的define
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示什么?表示x连接y,举例说:
int&<60; n = Conn(123,456);&<60;&<60;结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧
再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant&<60;&<60; :P
最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";
最后留几个小试验给大家去测测:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
结果会如何呢? 嘿嘿嘿嘿~
如果看过mfc那么,那么拿出一些application framework里面的宏,估计会吓死一片。说了这么多只是想说,不明白其用法的人很害怕,但要是知道它,熟悉它,那么你会觉得它很美妙。
进入正题:
#define的个用法:
1:#define MAX 0x18
第一个用法意义就在于定义标识符,这个比较常见而且也比较容易理解。将MAX的地方看做是0x18。
2:#define afx_msg
这个可能不常见,但实际上很常见,在mfc里面经常看到某个消息处理函数的前面就是afx_msg,但是究其根源会发现如上定义,
原来啊,#define可以将标识符定义为空,那么mfc为什么要定义呢,这个是项目规划的问题了。可能以后要在afx_msg后面添加
什么东西呢,但更重要的这种宏可以用于提供附加信息。一个用afx_msg修饰的函数,可以让读者很容易知道这个函数是一个处理消息的函数!且这个用经常用在头文件包含方面,后面会讲。
3:#define MAX(a,b) a>b?a:b
这个就是#define最大的用处了可以说,这个称为定义宏。可以当函数使用。但为什么可以当函数使用呢?就在于#define的根本,
不管他是定义标识符也好,定义宏也好,说本质就是个文本替换。所以有了上面的宏定义。那么你可以写出这样的代码。
#define MAX(a,b) a>b?a:b
void main()
{
int a=1;
int b=2;
int c=MAX(a,b);
}
那么关键的那行代码就在编译的时候被替代成:int c=a>b?a:b;这是?:语法。大家都知道可以得到最大值。
不过呢?实际使用的时候我们采取一个原则,分层加括号原则,上面的宏采用这个原则改写后:
#define MAX(a,b) (a>b?a:b)
为什么要这么写呢?请看下面代码:
int c = a * MAX(a,b);
如果采用一开始的写法,展开如下:
int c = a * a >b?a:b;
看到了,最大值比较的是a*a和b。所以出错了!
但采用分层之后就肯定不会错了,分层加括号方法展开如下:
int c = a * (a > b? a: b);
所以大家以后写宏的时候记得要用分层加括号原则。
4:#define TOSTR(x) #x
其实这也是宏,只不过用来引出几个宏定义中常用的语法。
上面的宏将x变成字符串x。下面是三个常用的:
#define TOSTR(X) #X //TOSTR(xujie)代表:"xujie"
#define ADDPRE(X) add##X //ADDPRE(xujie)代表:addxujie //注意这可不是字符串
#define TOCHAR(X) #@x //TOCHAR(x)代表:'x'
#代表:将宏参数转换成字符串
##代表:将##左右的标识符连接成一个,但不是字符串
#@代表:将宏参数转换成单个字符
5:#define IMPLEMENT_SERIAL(theClass,baseClass) IMPLEMENT_DYMCREATE(theClass,baseClass)/
CObject* PASCAL CreateObject() {/
return cass##theClass}
这是一个三行宏,那么其实语法就一点,#define后面出现的第一个标识符,将代替后面多行代码。同一宏之间的多行代码用/连接在一起。
用上简单的宏语法在加上多行注释,再加上Microsoft那帮疯子,就出现了我们mfc里面精妙绝伦的宏了。
也请注意将#define和typedef做区别,前几个博客已经讲明了。
///////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中
#define BEGIN_INTERFACE_PART(localClass, baseClass) \
&<60;class X##localClass : public baseClass \
本来这个宏定义很容易理解的,但是这里多出个X##,我真没见过这种用法,不晓得它是什么用意。
后来问了几个朋友也都不知道。
你知道么?
也许你也不知道~呵呵,最后我还是找到了相关的资料,解读了这个define,还顺便认识了另外两个不常用的define
#define Conn(x,y) x##y
#define ToChar(x) #@x
#define ToString(x) #x
x##y表示什么?表示x连接y,举例说:
int&<60; n = Conn(123,456);&<60;&<60;结果就是n=123456;
char* str = Conn("asdf", "adf")结果就是 str = "asdfadf";
怎么样,很神奇吧
再来看#@x,其实就是给x加上单引号,结果返回是一个const char。举例说:
char a = ToChar(1);结果就是a='1';
做个越界试验char a = ToChar(123);结果是a='3';
但是如果你的参数超过四个字符,编译器就给给你报错了!error C2015: too many characters in constant&<60;&<60; :P
最后看看#x,估计你也明白了,他是给x加双引号
char* str = ToString(123132);就成了str="123132";
最后留几个小试验给大家去测测:
#define Dec(x,y) (x-y)
int n = Dec( A(123,1), 1230);
n = Conn(123, Conn(123,332) );
char* str = A("12", ToString( Dec(3,1));
结果会如何呢? 嘿嘿嘿嘿~
相关文章推荐
- #define用法总结
- #define的用法总结
- #define用法总结
- 关于typedef的用法总结(以及typedef与#define的用法区别)
- #define用法总结
- C语言之#define用法总结
- #define的用法总结
- #define总结-#define用法集锦 (网上资料汇集)
- #define用法详解 及#ifndef #define #endif 总结
- C语言之#define用法总结
- #define用法总结
- C++ #define用法总结
- C语言中#define用法总结
- #define总结-#define用法集锦
- #define 用法总结
- #define用法_总结
- #define用法总结
- #define用法总结
- 关于typedef的用法总结及typedef 与#define的区别
- #define总结-#define用法集锦 (网上资料汇集)