玩心未泯

卡尔斯希普拉斯

C++博客 首页 新随笔 联系 聚合 管理
  19 Posts :: 0 Stories :: 75 Comments :: 0 Trackbacks
最近看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));
结果会如何呢? 嘿嘿嘿嘿~
posted on 2007-04-20 16:39 SuperPlayeR 阅读(6976) 评论(13)  编辑 收藏 引用 所属分类: C/C++

评论

# re: 你也许不知道的#define用法 2007-04-24 16:55 Rome
…… MFC很多宏就是这样的啊大哥……  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-04-24 17:14 SuperPlayeR
是啊,但是我一直没注意到过。那次看到了,才想搞清楚它是啥意思,幸亏最后还是搞清楚了,就写篇随笔让和我一样不知道的兄弟们认识认识咯。  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-07-06 01:35 至尊拖鞋
认识了,虽然没见过
:P  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-08-21 21:38 rgf
见识了  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-09-04 10:07 gg

  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-09-28 10:05 hanny
就想查这个呢  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-10-18 10:28 luguo
tochar怎么不能用呢?  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-10-18 11:19 Minidx全文检索
tochar可以用的阿
楼上的什么情况下不能用?  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-10-18 11:21 蚂蚁终结者
#@x
倒没怎么见过  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-11-09 09:32 游客
#define oprev(otri1, otri2) sym(otri1, otri2); lnextself(otri2);
这种定义什么意思  回复  更多评论
  

# re: 你也许不知道的#define用法 2007-11-09 09:33 游客
是不是作为候选项?
向你请教一下,谢谢  回复  更多评论
  

# re: 你也许不知道的#define用法 2008-06-06 17:10 wjh0303
3q!  回复  更多评论
  

# re: 你也许不知道的#define用法 2008-08-28 11:41 apacs
太有用了  回复  更多评论
  


标题  
姓名  
主页
验证码 *
内容(提交失败后,可以通过“恢复上次提交”恢复刚刚提交的内容)  
  登录  使用高级评论  新用户注册  返回页首  恢复上次提交      
[使用Ctrl+Enter键可以直接提交]
相关链接:
网站导航: