通过#define连接字符串的特殊方法[转]
//在#define中,标准只定义了#和##两种操作。#用来把参数转换成字符串,##则用来连接两个前后两个参数,把它们变成一个字符串。
#define Conn(x,y) x##y //连接x,y
#define ToChar(x) #@x //加单引号
#define ToString(x) #x //加双引号
最近看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 <stdio.h>
#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
通过#define连接字符串的特殊方法[转]的更多相关文章
- MySQL数据库无法使用+号连接字符串的处理方法
		转自:http://www.maomao365.com/?p=10003 摘要: 下文讲述MySQL数据库,字符串连接的方法分享,如下所示:实现思路: 使用concat函数对两个字符串进行连接在MyS ... 
- Windows Azure 网站:应用程序字符串和连接字符串的工作原理
		编辑人员注释:本文章由 Windows Azure 网站团队的首席项目经理 Stefan Schackow 撰写. Windows Azure 网站上有一个方便的功能,即开发人员可将 Azure 中的 ... 
- Python字符串连接的5种方法
		总结了一下Python字符串连接的5种方法: 加号 第一种,有编程经验的人,估计都知道很多语言里面是用加号连接两个字符串,Python里面也是如此直接用 "+" 来连接两个字符串: ... 
- 学习Linux shell脚本中连接字符串的方法
		这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ... 
- Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项)
		Oracle数据库中,在SQL语句中连接字符串的方法是哪个?(选择1项) A.cat B.concat C.join D.+ 解答:B 
- 问题:oracle LISTAGG 连接字符串;结果:Oracle 连接字符串的方法
		Oracle 连接字符串的方法 方法一:wmsys.wm_concat(column) 介绍:其函数在Oracle 10g推出,在10g版本中,返回字符串类型,在11g版本中返回clob类型.括号里面 ... 
- VS连接Access数据库--连接字符串及执行查询语句的方法(增删改查,用户名查重,根据用户获取密码查询)
		ACCESS数据的连接及语句执行操作,不难,久不用会生疏,每次都要找资料,干脆自己整理下,记录下来,需要的时候,直接查看,提高效率.也供初学者参考 1.连接字符串 public static stri ... 
- .NET Core 获取数据库上下文实例的方法和配置连接字符串
		目录 .NET Core 获取数据库上下文实例的方法和配置连接字符串 ASP.NET Core 注入 .NET Core 注入 无签名上下文 OnConfigure 配置 有签名上下文构造函数和自己n ... 
- ConnectionString连接字符串-密码丢失的解决方法
		今天遇到一个问题,EF,asp.net web端登录成功,退出,再登录就异常了, 登出成功时, EF 中 dbcontext.Database.Connection.ConnectionString ... 
随机推荐
- @几种OutOfMemory异常
			Java虚拟机运行时数据区 在Java虚拟机规范的描述中,除了程序计数器之外,虚拟机内存的其他几个运行时区域都会发生OutOfMemory异常的可能. 我们可以在IDE(如IDEA)中设置虚拟机启动参 ... 
- C#如何使用SplitContainer控件实现上下分隔
			C#如何使用SplitContainer控件实现上下分隔 Orientation 属性设置为Horizontal 完美世界 http://www.23cat.com/Contents_51864.ht ... 
- iOS:调节系统的亮度
			一.简单介绍 亮度是UIScreen的一个浮点型属性,而UIScreen是一个单例,所以这个亮度是全局的,任何一个地方改动,整个手机的亮度都会改变.这个亮度在iOS5.0后被苹果开放,开发者可以很方便 ... 
- 基于Bootstrap+jQuery.validate Form表单验证实践
			基于Bootstrap jQuery.validate Form表单验证实践 项目结构 : github 上源码地址:https://github.com/starzou/front-end- ... 
- Android Studio快速集成讯飞SDK实现文字朗读功能
			今天,我们来学习一下怎么在Android Studio快速集成讯飞SDK实现文字朗读功能,先看一下效果图: 第一步 :了解TTS语音服务 TTS的全称为Text To Speech,即“从文本到语音” ... 
- Double-Array Trie 原理解析
			http://ansjsun.iteye.com/blog/702255 Trie树是搜索树的一种,它在本质上是一个确定的有限状态自动机,每个结点代表一个状态,根据输入变量的不同,进行状态转 ... 
- 测试数据——有效范围(2)
			测试数据库搞好,学习了一下逾期率的官方定义: • 对于某支标,如果某一期没有正常还款,则悲观逾期率=所有未还本金/借款本金: • 对于一批标,悲观逾期率=当前逾期标的所有未还本金/借款本金: • 以3 ... 
- Jquery Ajax 返回数据类型变成document
			下面是我写的一段Jquery Ajax的代码,在chrome下没有问题,在firefox下就算是返回success也提示"系统正忙"; $.ajax({ url: "fa ... 
- OpenGL ES 3.0之Texturing纹理详解(二)
			Texture Filtering and Mipmapping 纹理过滤与多级纹理 前面我们已经讲了单个2D图像的2D纹理的介绍,这篇文章主要讲解多级纹理.纹理坐标是用于生成一个2D索引,当放大和缩 ... 
- 优化MySQL开启skip-name-resolve参数时显示“ignored in --skip-name-resolve mode.”Warning解决方法
			转自:http://blog.csdn.net/yiluoak_47/article/details/53381282 参数用途: skip-name-resolve #禁止MySQL对外部连接进行D ... 
