//在#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连接字符串的特殊方法[转]相关推荐

  1. 在Python中连接字符串的首选方法是什么?

    本文翻译自:Which is the preferred way to concatenate a string in Python? Since Python's string can't be c ...

  2. java字符连接字符串数组_Java中连接字符串的最佳方法

    java字符连接字符串数组 最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗. 这些是我要研究的方法: 使用 ...

  3. Java中连接字符串的最佳方法

    最近有人问我这个问题–在Java中使用+运算符连接字符串是否对性能不利? 这让我开始思考Java中连接字符串的不同方法,以及它们如何相互对抗. 这些是我要研究的方法: 使用+运算符 使用StringB ...

  4. mysql连接字符串 端口_浅析C#下MySQL连接字符串数据库服务器端口号

    正常的C#下MySQL连接字符串配置,这是在MSSQL服务器端口是1433(默认)的情况下. 但是有时候,为了数据库服务器安全,这个端口会被改成其它的,这时再用这C#下MySQL连接字符串,连接数据库 ...

  5. linux shell脚本字符串连接符,学习Linux shell脚本中连接字符串的方法

    这篇文章主要介绍了Linux shell脚本中连接字符串的方法,如果想要在变量后面添加一个字符,可以用一下方法: 代码如下: $value1=home $value2=${value1}"= ...

  6. python list元素合并_python list 合并连接字符串的方法

    python list 合并连接字符串的方法 更新时间:2013年03月09日 22:02:18 作者: python 列表合并字符串,我们一般会用到字符串的join方法来操作.下面通过代码的形式,详 ...

  7. Java中String类的concat方法___java的String字符串的concat()方法连接字符串和“+“连接字符串解释

    Java中String类的concat方法 在了解concat()之前,首先需要明确的是String的两点特殊性. 长度不可变 值不可变 这两点从源码中对String的声明可以体现: private ...

  8. python 列表去重拼题a_python list 合并连接字符串的方法 -电脑资料

    比如下面一个list 复制代码代码如下: binfo = ['lao','wang','python'] 我们通过help方法得知,可以用string的join方法来解决, 下面我们通过空格来连接3个 ...

  9. 在Excel中连接字符串的方法

    在Excel中连接字符串的方法                                          此段文字节选自<Excel 2007技巧大全>一书 有时在使用Excel过 ...

最新文章

  1. 2021清北毕业生去向关键词:进体制、搞教育、国内深造
  2. MYSQL查看和修改存储引擎
  3. JMX 与系统管理--转
  4. “网红” WebAssembly 与 K8s 如何实现双剑合璧?
  5. springboot中如何获取yml配置文件中的配置信息
  6. k8s部署nfs-client-provisioner完整实践版(亲测有效)
  7. ACM 中常用的算法有哪些? 2014-08-21 21:15 40人阅读 评论(0) 收藏...
  8. swift怎么调用Java,Swift完成UIAlertController的调用
  9. 学python开发必须要会wsgi么_学python着几个要搞清楚WSGI和uWSGI区别
  10. vue页面传参(多个参数传值)与接参 - 代码篇
  11. C语言课后习题(8)
  12. azure上传excel_使用MS Excel访问Azure中的关系SQL数据库
  13. java模拟网银登录_Java模拟网上银行业务
  14. 顺着IP地址他们能找到我家吗?
  15. WebRAY网站检查技术支撑平台的实践
  16. WinRunner:强大的企业级自动化测试工具
  17. 记一次ARM CHINA面试
  18. 第十一章 软件能力成熟度模型
  19. 微信支付的appid,appsecret,商户号mchid,微信交易支付密钥在哪里查看
  20. 从零开始搭建ROS智能小车@sp头子

热门文章

  1. Windows驱动—Windows应用程序和Windows驱动通信编程
  2. Codeforces Round #565 (Div. 3) A B C E
  3. hadoop常见算法(持续更新)
  4. zoj 1789 The Suspects
  5. jQuery万能浮动框插件测试
  6. 设置ORACLE_HOME环境变量
  7. Flink万字干货:4大发展方向,美团、快手应用实践(PDF下载)
  8. Windows 95被做成了一款软件,可玩扫雷和纸牌
  9. 51单片机如何用c语言位定义,嵌入式编程(一):51单片机如何将函数 定义到指定程序地址...
  10. 我最爱用的一款 Redis 可视化管理工具!好用到爆!!!