通过#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连接字符串的特殊方法[转]相关推荐
- 在Python中连接字符串的首选方法是什么?
本文翻译自:Which is the preferred way to concatenate a string in Python? Since Python's string can't be c ...
- java字符连接字符串数组_Java中连接字符串的最佳方法
java字符连接字符串数组 最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗. 这些是我要研究的方法: 使用 ...
- Java中连接字符串的最佳方法
最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗. 这些是我要研究的方法: 使用+运算符 使用StringB ...
- mysql连接字符串 端口_浅析C#下MySQL连接字符串数据库服务器端口号
正常的C#下MySQL连接字符串配置,这是在MSSQL服务器端口是1433(默认)的情况下. 但是有时候,为了数据库服务器安全,这个端口会被改成其它的,这时再用这C#下MySQL连接字符串,连接数据库 ...
- linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法
这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...
- python list元素合并_python list 合并连接字符串的方法
python list 合并连接字符串的方法 更新时间:2013年03月09日 22:02:18 作者: python 列表合并字符串,我们一般会用到字符串的join方法来操作.下面通过代码的形式,详 ...
- Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释
Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...
- python 列表去重拼题a_python list 合并连接字符串的方法 -电脑资料
比如下面一个list 复制代码代码如下: binfo = ['lao','wang','python'] 我们通过help方法得知,可以用string的join方法来解决, 下面我们通过空格来连接3个 ...
- 在Excel中连接字符串的方法
在Excel中连接字符串的方法 此段文字节选自<Excel 2007技巧大全>一书 有时在使用Excel过 ...
最新文章
- 2021清北毕业生去向关键词:进体制、搞教育、国内深造
- MYSQL查看和修改存储引擎
- JMX 与系统管理--转
- “网红” WebAssembly 与 K8s 如何实现双剑合璧?
- springboot中如何获取yml配置文件中的配置信息
- k8s部署nfs-client-provisioner完整实践版(亲测有效)
- ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏...
- swift怎么调用Java,Swift完成UIAlertController的调用
- 学python开发必须要会wsgi么_学python着几个要搞清楚WSGI和uWSGI区别
- vue页面传参(多个参数传值)与接参 - 代码篇
- C语言课后习题(8)
- azure上传excel_使用MS Excel访问Azure中的关系SQL数据库
- java模拟网银登录_Java模拟网上银行业务
- 顺着IP地址他们能找到我家吗?
- WebRAY网站检查技术支撑平台的实践
- WinRunner:强大的企业级自动化测试工具
- 记一次ARM CHINA面试
- 第十一章 软件能力成熟度模型
- 微信支付的appid,appsecret,商户号mchid,微信交易支付密钥在哪里查看
- 从零开始搭建ROS智能小车@sp头子
热门文章
- Windows驱动—Windows应用程序和Windows驱动通信编程
- Codeforces Round #565 (Div. 3) A B C E
- hadoop常见算法(持续更新)
- zoj 1789 The Suspects
- jQuery万能浮动框插件测试
- 设置ORACLE_HOME环境变量
- Flink万字干货:4大发展方向,美团、快手应用实践(PDF下载)
- Windows 95被做成了一款软件,可玩扫雷和纸牌
- 51单片机如何用c语言位定义,嵌入式编程(一):51单片机如何将函数 定义到指定程序地址...
- 我最爱用的一款 Redis 可视化管理工具!好用到爆!!!