玩心未泯

卡尔斯希普拉斯

C++博客 首页 新随笔 联系 聚合 管理
  19 Posts :: 0 Stories :: 98 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 阅读(25777) 评论(21)  编辑 收藏 引用 所属分类: 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
太有用了  回复  更多评论
  

# re: 你也许不知道的#define用法 2008-12-23 17:33 hello
A(...)是什么函数呀?  回复  更多评论
  

# 这道程序是怎样运行的? 2009-06-13 08:11 望忧谷
# define M(x,y,z) x*y+z
#include <stdio.h>
void main()
{int a=1,b=2,c=3;
printf ("%d\n",M(a+b,b+c,c+a));
}  回复  更多评论
  

# 宏替换 2009-06-13 09:59 Cup
printf ("%d\n",M(a+b,b+c,c+a)); 等价于
printf ("%d\n", (a+b*b+c+c+a));  回复  更多评论
  

# re: 你也许不知道的#define用法[未登录] 2010-03-31 11:05 K
谢了~

有些东东不找到你就很难猜到:)  回复  更多评论
  

# re: 你也许不知道的#define用法 2010-04-19 10:12 dandanfeng160
我遇到了和你们一样的问题,向楼主请教~~
@hello
@Minidx全文检索
@蚂蚁终结者
  回复  更多评论
  

# re: 你也许不知道的#define用法[未登录] 2010-12-14 20:55 dd
不錯~~thx  回复  更多评论
  

# re: 你也许不知道的#define用法 2011-05-06 08:21 ffff
请问如果要插入#号怎么弄?
比如 #define a(n,b) 我希望替换成 #define n (b)
请问怎么弄?  回复  更多评论
  

# re: 你也许不知道的#define用法 2012-11-12 14:00 eagledame
谢谢了 ,找的也是这个  回复  更多评论
  


只有注册用户登录后才能发表评论。
【推荐】超50万行VC++源码: 大型组态工控、电力仿真CAD与GIS源码库
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理