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,如需转载请自行联系原作者
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
C++ 中的定义和 C 语言中的定义类似,也是一种预处理指令,用于在编译之前将源代码中的标识符替换为指定的文本。不过,在 C++ 中,定义还可以用于实现一些类似函数的和模板元编程等高级特性。 C++ 中的定义的基本语法和 C 语言中类似,如下所示: ```c++ #define 体 ``` 其中,名是标识符,体可以是任意合法的 C++ 表达式、语句或代码块。例如: ```c++ #define PI 3.1415926 #define MAX(a, b) ((a) > (b) ? (a) : (b)) ``` 上面的定义中,第一个将名 PI 定义为常量 3.1415926,第二个将名 MAX 定义为求两个数的最大值的函数式。在源代码中,可以通过名来引用体,例如: ```c++ float r = 1.0; float area = PI * r * r; int max_num = MAX(3, 5); ``` 与 C 语言相比,C++ 中的定义还有一些高级特性,包括: 1. 可变参数:类似于 C 语言中的可变参数函数,可以定义一个参数数量不定的,例如: ```c++ #define PRINT(fmt, ...) printf(fmt, ##__VA_ARGS__) ``` 上面的定义可以用来输出带格式的文本,类似于 printf 函数。 2. 预定义C++ 中有一些预定义的,可以用来表示编译器、操作系统、编译时间等信息,例如: ```c++ #ifdef __cplusplus // C++ 代码 #else // C 代码 #endif ``` 上面的定义可以用来区分 C++ 代码和 C 代码。 3. 高级C++ 中的定义还可以用来实现一些高级特性,比如模板元编程、泛型编程等。例如: ```c++ #define STATIC_ASSERT(condition) \ typedef char static_assertion_##__LINE__[(condition) ? 1 : -1] ``` 上面的定义可以用来实现静态断言,类似于 C++11 中的 static_assert。 需要注意的是,定义的滥用会导致代码的可读性和可维护性变差,因此需要谨慎使用定义,尽量使用 C++11 中的 constexpr、inline、template 等语言特性替代定义。此外,还需要注意定义的展开顺序和优先级,以避免出现错误或者副作用。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值