在C++的宏定义中,符号##一般是用于连接,包括参数的连接,参数与标识符的连接等,然后形成一个新的标识符。
下面举几个例子来进行说明。
eg1:
#define ADD(a,b) a##b
#define ab "123456"
int main()
{
string str=ADD(a,b); //ADD(a,b)结果为ab,此时str=ab
std::cout<<str<<std::endl; // #define ab "123456" 将ab定义为"123456",所以, \\str="123456"
return 0;
}
或者不用#define ab "123456",直接在main函数中定义一个string ab="123456"也是可以的。
 
eg2:
参数 __VA_ARGS__ 的使用;
参数 __VA_ARGS__ 一般用于代替宏定义中的参数,或者说是没有明确命名的参数:
举例说明:
#define DECLEAR(Var1,...)\
int judge=0;\
int m##Var1=1;\
int n##__VA_ARGS__=2;\
 
int main()
{
DECLEAR(INT,REPEATED);
if(judge==0)
std::cout<<"hello1"<<std::endl;
if(mINT==1)
std::cout<<"hello2"<<std::endl;
if(nREPEATED==2)
std::cout<<"hello3"<<std::endl;
return 0;
}
 
输出为:
hello1
hello2
hello3
 
说明:
(1)#define(Var1,...)说明该宏定义至少会接收一个参数,后面的"..."可以认为是很多个参数,但是没有命名
(2)int m##Var1=1:这里的操作是将m于Var1进行连接组成一个新的标识符,,mian函数中,调用DECLEAR(INT,REPEATED),所以,Var1为INT,m##Var1组成的新标识符即为mINT=1;
(3)int n##__VA_ARGS__=2: 这里使用到了参数__VA_ARGS__, 该参数的作用一般标识未命名的标识符,在main中,DECLEAR(INT,REPEATED)传两个参数,但是DECLEAR宏定义时只有一个参数Var1,其余用"..."表示,此时,__VA_ARGS__的作用就是用于表示"..."代表的参数,这里也就是REPEATED, 所以int n##__VA_ARGS__=2也就是int nREPEATED=2;
(4)宏定义中每一句代码后面跟\表示换行,一定要注意,"\"后面不要跟任何字符,空格也不可以有。包括注释"\\"或者/* */
 
如有不对的地方欢迎各位批评指正。
 
 

C++ 宏定义#define 中##的使用的更多相关文章

  1. C语言 预处理二(宏定义--#define)

    //#define 宏定义(宏定义一般大写) //知识点一-->#define的作用域:从#define开始,从上往下,如果遇到#undef就到#undef处结束,如果没有就是作用于当前整个文件 ...

  2. 宏定义#define和typedef的区别和典型范例题目辨析

    宏定义#define pStr char*  ,是直接把程序中出现pStr的地方替换成char* ,直接替换: typedef  char * pStr; 是给char*定义一个别名叫做 pStr; ...

  3. 读书笔记 effective c++ Item 2 尽量使用const,枚举(enums),内联(inlines),不要使用宏定义(define)

    这个条目叫做,尽量使用编译器而不要使用预处理器更好.#define并没有当作语言本身的一部分. 例如下面的例子: #define ASPECT_RATIO 1.653 符号名称永远不会被编译器看到.它 ...

  4. C语言宏定义#define用法

    #define是C语言中提供的宏定义命令,其主要目的是为程序员在编程时提供一定的方便,并能在一定程度上提高程序的运行效率,但学生在学习时往往不能 理解该命令的本质,总是在此处产生一些困惑,在编程时误用 ...

  5. 宏定义#define整理

    一.宏定义#define 优点:一方面可以节省程序的空间上的篇幅,另外,恰当地使用宏定义可提高程序的时间效率.代码可以写的通俗易懂.可以提高程序的清晰性.可读性,使于修改移植等. 缺点:宏定义的使用实 ...

  6. 【C++】内联函数(inline)和宏定义(# define)的优劣及其区别

    一.宏定义:# define 1.为什么要使用宏? 因为调用宏比调用函数更有效率,函数的调用必须要将程序的执行顺序转移到函数所存放的内存地址中,将函数程序内容执行完后,再返回到执行该函数前的地方,这种 ...

  7. c语言宏定义#define的理解与资料整理

    1. 利用define来定义 数值宏常量 #define 宏定义是个演技非常高超的替身演员,但也会经常耍大牌的,所以我们用它要慎之又慎.它可以出现在代码的任何地方,从本行宏定义开始,以后的代码就就都认 ...

  8. iOS之宏定义#define

    最基本的宏定义用法 #define aaa bbb 表示用aaa替换bbb的内容. 宏作用范围 宏的作用范围是在当前文件内, 如果需要作用于其他类(如在类b调用类a已定义宏),那么需要在类b引入类a的 ...

  9. _编程语言_C++_宏定义#define 和 常量const 的区别

    C++中有两种定义常量的方式:#define预处理和const关键字 #define 预处理指令 #include <iostream> using namespace std; #def ...

随机推荐

  1. 【转】典型的JavaScript面试题

    问题1: 作用域(Scope) (function() { "use strict"; var a = b = 5; })(); console.log(b); 控制台(conso ...

  2. ES6入门2

    for-of循环: 新语法如下: for (var value of myArray) { console.log(value); } 它的优点是: 这是目前遍历数组最简洁和直接的语法: 它避免了fo ...

  3. 11154 LRC才不会告诉你们的事情

    #include<stdio.h> #include<string.h> int main() { ,t=; ],sum[],k=,d=; ]; ]; scanf(" ...

  4. php原生自定义验证码,5分钟搞定你的问题

    当然现在很多php的框架里面自带了很多很多验证码,我的这个验证码,也是当初刚刚入行的时候学习模仿的.现在照搬出来,希望对刚入门的朋友有所帮助. **************************** ...

  5. 搭建Elasticsearch集群常见问题

    一.ES安装方法: Linux用户登录(bae),我们用的是5.3版本的包.从官网下载: curl -L -O https://artifacts.elastic.co/downloads/elast ...

  6. java基础(一章)

    java基础(一章) 1.            java是一种面向对象的高级编程语言. 2.            java包括:              javase(java基础)       ...

  7. dedecms搜索提示"关键字不能小于2个字节!"

    在测试自己制作的搜索页模板时,如果遇到搜索时提示"关键字不能小于2个字节!"!打开plus/search.php把   if(($keyword=='' || strlen($keyword)< ...

  8. SQL Server使用导入导出向导导入超过4000个字符的字段的数据

    在使用SQL Server导入导出向导导入数据的时候,我们经常会碰到某个单元格的数据超长而被截断报错的情况.本文针对这种场景给出相应的解决方案.   环境描述:SQL Server 2012,文件源: ...

  9. Chapter 3:Speech Production and Perception

    作者:桂. 时间:2017-05-24  09:09:36 主要是<Speech enhancement: theory and practice>的读书笔记,全部内容可以点击这里. 一. ...

  10. angularjs应用prerender.io 搜索引擎优化实践

    上一篇博文(http://www.cnblogs.com/ideal-lx/p/5625428.html)介绍了单页面搜索引擎优化的原理,以及介绍了两个开源框架的优劣.prerender框架的工作原理 ...