#define的其他用法

来源:互联网 发布:王者荣耀网络延迟460 编辑:程序博客网 时间:2024/05/16 19:45

转载自:http://wenku.baidu.com/link?url=ZXp_ZLnfn-ygKyVYWcYe-fFEBD2ouzEpKkIjSA0iX2G5sVYxhoa5cBGVemTc2MkSo5Fim7EgDDP92PEgcRj7VJewF1AO--W1WbOaUVigEwy



最近看com相关的资料,看到CCmdTarget实现com接口的时候,去读了一些宏的定义,在afxdisp.h头文件中

#define BEGIN_INTERFACE_PART(localClass, baseClass) \
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 n = Conn(123,456);   结果就是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   :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 xxx() {} 
标准C支持的
#define xxx() ({})
GCC新增的功能,主要为了防止宏展开出现问题,默认展开时是要加上一个;的,容易出问题。

CODE:

#define A(a,b,c) ({a=1;b+=1;c=3;a+b+c;})
#include <stdio.h>
int main()
{
       int a;
       int b=1;
       int c;
       int d;
       d=A(a,b,c);
       printf("%d,%d,%d,%d\n",a,b,c,d);
       return 0;
}
表示该宏函数还有返回值,最后一个式子的返回值作为宏函数的返回值。
运行结果:
1,2,3,6

0 0
原创粉丝点击