在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. php 使用composer

    之前写过相关的composer,之后碰到了几个朋友问我,我整理了一下,方便自己也方便大家日后查阅~~不玩开源的程序员不是好厨子     1.执行在线安装         curl -sS https: ...

  2. 我总结的常用sql语句

    建表: Set sql_mode='strict_trans_tables':  存储引擎启用严格模式,非法数据值被拒绝 Create table t3(id int(4) primary key a ...

  3. JBoss7 如何用脚本 启动 和 停止

    用脚本来启动/停止JBoss服务器,有助于开发部署的 自动执行,提高工作效率. 在JBoss以前的版本中,很容易在bin目录下面找到 启动和停止服务器的脚本: run.bat shutdown.bat ...

  4. 如何打一个FatJar(uber-jar)

    如何打一个FatJar(uber-jar) FatJar也就叫做UberJar,是一种可执行的Jar包(Executable Jar).FatJar和普通的jar不同在于它包含了依赖的jar包. 1. ...

  5. DedeCMS数据负载性能优化方案简单几招让你提速N倍

    前文介绍了DedeCMS栏目列表页实现完美分页的方法,避免了大部分重复栏目标题对搜索引擎的影响,对SEO更有利.今天,分享一下DedeCMS数据负载性能优化的方法. 接触织梦也有三年多时间了,对它可谓 ...

  6. python 字典的常见操作

    字典 字典的增删改查 字典的创建方式: # 创建字典类型 info = { 'name':'李白', ', 'sex':'男' } msg = { 'user01':'Longzeluola', 'u ...

  7. 一天搞定HTML----a标签02

    1.细说a标签 2.代码演示 <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> ...

  8. 深入探索C++对象模型(四)

    Function语意学(The Semantics of Function) static member functions不可能做到的两点:(1)直接存取nonstatic数据,(2)被声明为con ...

  9. JavaScript设计模式_03_代理模式

    代理模式是非常常见的模式,比如我们使用的VPN工具,明星的经纪人,都是代理模式的例子.但是,有人会疑问,明明可以直接访问对象,为什么中间还要加一个壳呢?这也就说到了代理模式的好处.在我看来,代理模式最 ...

  10. 逆向libbaiduprotect(四)

    百度加固libbaiduprotect.so自身对只读字符串进行了加密保护,防止成为破解和逆向的切入口.一般地认为,只要找出这个解密算法就可以对.rodata段的只读字符串进行破解,从而窥探程序的意图 ...