C++宏的高级用法

简介:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#ifndef __GNUC__
     #error 编译器为g++,windows下,好像没有把##生成的新字符串当成一个宏处理
#endif
 
#define conn(x,y)    x#y
// x必须是一个字符串,使用时,conn("2",3),而不能是conn(2,3),3可以是任何类型的字符串
 
// ## 有两种用法,一种是字符串连接,另一种是把连接生成的字符串当成一个新的宏
// 新宏必须存在
// 用##连接中参数中包含已定义的宏时,宏不会展开
 
#define STR test
#define hello(x,y,z)    x##y##z
 
// 第一种用法
cout<<hello(1,2,3)<<endl;         // 输出 123
// 第二种用法
#define xyz 333
cout<<hello(x,y,z)<<endl;         // 即xyz这个宏必须存在,然后输出333
cout<<hello(STR,y,z)<<endl;       // STR不会展开
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
// 测试程序
#include <iostream>
using  namespace  std;
 
#ifndef __GNUC__
     #error 编译器为g++,windows下,好像没有把##生成的新字符串当成一个宏处理
#endif
 
#define conn(x,y)    x#y
// x必须是一个字符串,使用时,conn("2",3),而不能是conn(2,3),3可以是任何类型的字符串
 
// ## 有两种用法,一种是字符串连接,另一种是把连接生成的字符串当成一个新的宏
// 新宏必须存在
// 用##连接中参数中包含已定义的宏时,宏不会展开
// ##连接时,要么全是数字,要么,连接生成的字符串必须是已经定义的宏
#define hello(x,y,z)    x##y##z
  
int  main()
{
         cout<<conn( "2" ,3)<<endl;          // 输出 23
         // 第一种用法
         cout<<hello(1,2,3)<<endl;         // 输出 123
         // cout<<hello(a,2,3)<<endl;     // 会报错,看起来,g++只支持第二种用法
         // 第二种用法
         #define xyz 333
         cout<<hello(x,y,z)<<endl;         // 即xyz这个宏必须存在,然后输出333
         //cout<<hello(STR,y,z)<endl;     // STR没有展开
         return  0;
}









本文转自 hakuyo 51CTO博客,原文链接:http://blog.51cto.com/hakuyo/1861724,如需转载请自行联系原作者
目录
相关文章
|
3月前
|
编译器 C++ 容器
【C++】String常见函数用法
【C++】String常见函数用法
|
3月前
|
存储 程序员 编译器
c++学习笔记08 内存分区、new和delete的用法
C++内存管理的学习笔记08,介绍了内存分区的概念,包括代码区、全局区、堆区和栈区,以及如何在堆区使用`new`和`delete`进行内存分配和释放。
48 0
|
4月前
|
C++
C++ string中的函数和常用用法
C++ 中string中的函数和常用用法
43 4
|
5月前
|
Linux C++
c++高级篇(三) ——Linux下IO多路复用之poll模型
c++高级篇(三) ——Linux下IO多路复用之poll模型
|
5月前
|
缓存 监控 网络协议
c++高级篇(二) ——Linux下IO多路复用之select模型
c++高级篇(二) ——Linux下IO多路复用之select模型
|
5月前
|
存储 C++
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
C++初阶学习第十一弹——探索STL奥秘(六)——深度刨析list的用法和核心点
53 7
|
5月前
|
存储 人工智能 C++
map容器在C++中的具体用法以及相关注意点
map容器在C++中的具体用法以及相关注意点
54 1
|
5月前
|
算法 Linux Shell
c++高级篇(一) —— 初识Linux下的进程控制
c++高级篇(一) —— 初识Linux下的进程控制
|
6月前
|
编译器 C++
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
【C++】【C++的常变量取地址问题(对比C的不同)】const修饰的常变量&volatile修饰用法详解(代码演示)
|
6月前
|
安全 程序员 C++
C++ new和delete的用法
需要注意的是,使用 `new`和 `delete`分配和释放内存时,程序员负责管理内存的分配和释放,这可能导致内存泄漏或释放已释放内存的问题。因此,C++引入了智能指针(如 `std::shared_ptr`和 `std::unique_ptr`)以更安全和自动化地管理内存。
104 2