注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

天道酬勤 玩物丧志

用勇气去改变可以改变的事情,用胸怀去包容无法改变的事情,用智慧去判断两者的区别

 
 
 

日志

 
 

通过#define连接字符串的特殊方法  

2016-06-12 20:37:40|  分类: 计算机基础 |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |
http://hi.baidu.com/mgqw/blog/item/99b34880fc9b22df9023d91d.html
 简单的说,“##”是一种分隔连接方式,它的作用是先分隔,然后进行强制连接
   其中,分隔的作用类似于空格。我们知道在普通的宏定义中,预处理器一般把空格
   解释成分段标志
,对于每一段和前面比较,相同的就被替换。但是这样做的结果是,
   被替换段之间存在一些空格。如果我们不希望出现这些空格,就可以通过添加一些
   ##来替代空格
   另外一些分隔标志是,包括操作符,比如 +, -, *, /, [,], …,所以尽管下面的
   宏定义没有空格,但是依然表达有意义的定义: define add(a, b)  a+b
   而其强制连接的作用是,去掉和前面的字符串之间的空格,而把两者连接起来。

最近看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 TE text 
我想再定义一个宏,能将TE变为字符串("text"). 
即定义: 
#define STR(str) ??? //使用STR(TE)时能替换为"text"。 
请问???部分怎么实现呢?用#str是达不到目的的了,用'"'##str##'"'也不对。

#不能做二次替換,可以再定義一個中間宏 
#define TE text 
#define AD TE 
#define STR(AD) #AD 
試試

直接定义两个宏得了! 
#define TE text 
#define TE_S "text"


#define STR abc 
char arr[10] = "STR"; 
为什么arr数组中是STR而不是abc,define不是简单的字符替换吗? 

#define A "aaa" 
#define B "bbb"A 
我对macro这个东西不大熟悉……不过这样可以成功printf("%s\n",B); 


在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。 
#include 
#define paster( n ) printf( "token " #n" = %d\n ", token##n ) 
int main()
{
int token9=10;
paster(9);
return 0;
}
输出为
[leshy@leshy src]$ ./a.out
token 9 = 10

补充一点: 在用#define 定义时 ,可以用斜杠("\") 续行.与vb中的下划线(" _")作用同.
比如:
#define add1( x, y ) ( x + y) 
也可以表示成 :
#define add1(x,y) \
(x + y )

3个普通用法
1.
C: #define X 100   ----> C++: const int x=100;

2.
C: #define MAX(a,b) ((a)>(b)?(a):(b)) 
C++: inline int max(int a,int b){ return a>b?a:b;}

3.
     #ifndef NULL
         #define NULL ((void*)0)
     #endif

     #ifndef _myheadfile_h
         #define _myheadfile_h
     #endif
  评论这张
 
阅读(187)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2018