在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. jQ实现的一个轮播图

    众所周知,轮播图是被广泛的运用的. 轮播图我们在很多的网站上都可以看到,例如淘宝.京东这些网站都很常见. 下面开始我们的轮播之旅: 搭建我们的骨架: <!DOCTYPE html> < ...

  2. convertView的疑问(软件管理器)

    package com.hixin.appexplorer; import java.util.List; import android.app.Activity; import android.co ...

  3. js继承之原型链继承

    面向对象编程都会涉及到继承这个概念,JS中实现继承的方式主要是通过原型链的方法. 一.构造函数.原型与实例之间的关系 每创建一个函数,该函数就会自动带有一个 prototype 属性.该属性是个指针, ...

  4. Python爬虫学习(二) ——————爬取前程无忧招聘信息并写入excel

    作为一名Pythoner,相信大家对Python的就业前景或多或少会有一些关注.索性我们就写一个爬虫去获取一些我们需要的信息,今天我们要爬取的是前程无忧!说干就干!进入到前程无忧的官网,输入关键字&q ...

  5. ubuntu16.04 开发环境搭建

    1.更换源 sudo gedit /etc/apt/sources.list 2.更新系统 sudo apt-get update sudo apt-get dist-upgrade     3.移动 ...

  6. OVS + dpdk 安装与实验环境配置

    ***DPDK datapath的OVS的安装与实验环境配置 首先肯定是DPDK的安装       0:安装必要的工具            make            gcc           ...

  7. Java对【JSON数据的解析】--fastjson解析法

    要求:解析下面JSON数据 String string = "{no:1,name:'Android',employees:[{name:'zhangsan',age:20},{name:' ...

  8. Centos 环境一键部署脚本(shell脚本)

    谨以此文纪念吊炸天的Centos环境一键部署方案的新鲜出炉 辛苦大半年,产品准备上线了,BOSS亲自体验安装部署,看着超过200+页的安装文档直接崩溃了(需要部署23个基础服务),经历了超过3个小时的 ...

  9. SpringBoot学习helloworld

    这几天开始学习springBoot记录一下(Hello World) pom.xml <project xmlns="http://maven.apache.org/POM/4.0.0 ...

  10. [Leetcode] Binary search, DP--300. Longest Increasing Subsequence

    Given an unsorted array of integers, find the length of longest increasing subsequence. For example, ...