c++: define常见用法

#define 是宏定义命令,宏定义就是将一个标识符定义为一个字符串,源程序中的该标识符均以指定的字符串来代替。
#define 是预处理命令,因此会在预处理阶段被执行

因为#define是预处理命令,可以在预处理阶段看到结果,预处理命令
gcc -E demo.c -o demo.i

0x1无参宏定义

0x10常见无参宏定义

#define 标识符[替换字符] 字符串[被替换字符]
#define FLAG 1
#define SET_BIT_MASK 0x1
#define UNSET_BIT_MASK 0x0

0x11宏定义用于条件编译

在大规模的开发过程中,头文件很容易发生嵌套包含,可以使用#ifndef 配合 #define ,#endif 。
功能与 #pragma once 作用类似,都是为了防止多次编译一个头文件。

#ifndef COMPILE_H
#define COMPILE_H

...

#endif

0x12宏定义用于跨平台

跨平台和系统的软件里,可以在编译的时候通过#define设置编译环境

#ifdef WINDOWS
......
(#else)
......
#endif

#ifdef LINUX
......
(#else)
......
#endif

0x13 define用于定义别名【糟糕的用法】

0x131 定义变量

#include "iostream"
using namespace std;

#define intPtr int * //定义一个 int * 指针类型
int main() {
  intPtr x  = new int(6);
  cout << x << " " << *x << endl;

  system("pause");
  return 0;
}

歧义

define是宏定义,宏定义的处理阶段是预处理,其作用是简单的替换,根据替换结果再进行分析,发现歧义

intPtr y, z;
//实际替换结果:int * y,z;

0x132 定义函数

#include "iostream"
using namespace std;

void func() {
  cout << "hello " << endl;
}

#define PRINTHELLO func

int main() { 
  PRINTHELLO();
  system("pause");
  return 0;
}

0x2 有参宏定义

C++语言允许宏带有参数。
函数式宏是最有歧义的地方,经常与函数对比

  • 不进行类型检查:宏在预处理阶段进行替换
  • 多次替换可能导致代码体积增大:由于宏是通过文本替换实现的,如果在一个代码中使用多次,可能会导致生成的代码体积显著增大
  • 调试困难:由于宏在预处理阶段就已经展开,调试时难以准确追踪宏的调用和执行过程,增加了调试的难度
  • 可能引入副作用:由于宏在预处理阶段进行文本替换,如果宏内部包含有副作用的操作(如自增、自减);尤其是在变量在嵌套使用时,有可能会引入歧义

0x21 常见有参宏定义


#define 宏名(形参表) 字符串
#define ADD(x,y) (x+y)
#define SQR(x) ((x)*(x))

0x22 有参宏替换【小括号问题】

int a = 10;
#define SQUARE(X) (X * X)  // 不推荐,这样做只是方便理解,建议带小括号
// SQUARE(a + 2)
// val = (a + 2 * a + 2)
#define SQUARE(X) ((X) * (X))  // 推荐
// SQUARE(a + 2)
// val = ((a + 2) * (a + 2))

0x23 有参宏替换【字符化操作】

’#‘ 作用是将宏定义参数不经任何扩展地转换成字符串常量,所谓拓展包括:
宏定义参数的两边的空格会被忽略;
特殊字符会被加上转义字符;

#define ARG1 abc
#define ARG2 def
#define PLUS(X, Y) X#Y
// PLUS(ARG1, ARG2)
// ARG1#ARG2
// abcARG2

0x24 有参宏替换【标记连接操作】

’##‘ 的作用是在宏定义中,将两个部分连接成一个部分,需要注意:
用于连接,所以不能用在首尾;
其前后的空格无意义;

#define PLUS(X, Y) X##Y
// PLUS(AAA, BBB)
// AAABBB
// 例子
#define F abc
#define B def
#define FB(arg) #arg
#define FB1(arg) FB(arg)

cout << FB(F B);
/*
FB(F B)
#F B
F B
*/
cout << FB1(F B);
/*
FB1(F B);
FB(F B)
FB(abc def)
#abc def
abc def
*/
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值