1.标准格式
#define 标识符 字符串
(1) 说明
标识符为所定义的宏名,字符串可以为字符串、常数、表达式。
(2) 例子
#define PI 3.1415926
#define hello "hello world"
#define kk 1+2
2.拓展用法
(1) 带参定义
类似于函数,宏定义中的参数为形参,宏调用中的参数为实参。
格式:
define 宏名(形参表) 字符串
示例:
#define add(a,b) (a+b) // 看实际情况决定是否加括号
#define mul(a,b) (a*b)
#define MAX(a,b) a>b?a:b
(2) 定义代码段
可以使用续行符(\)来使代码更加美观。
格式:
define 宏名 {A \
B \
...
}
例子:
define TIME(func) { \
long long b=clock(); // 输出程序运行时间 \
func(); \
long long e=clock(); \
printf("%s run %dms",#func,1000*(e-b)/CLOCKS_PER_SEC); \
}
(3) c++内置宏
cout << "程序最后编译日期宏" << __DATE__ << endl;
cout << "程序最后编译时间宏" << __TIME__ << endl;
cout << "当前行数宏" << __LINE__ << endl;
cout << "当前运行文件名宏" << __FILE__ << endl;
cout << "当前运行函数宏" << __FUNCTION__ << endl;
cout << "当前运行函数宏" << __func__ << endl;
3.特殊操作符
(1)#
作用于宏调用中的实参,将实参转化为字符串。
例子:
#define TO_STR(s) #s
#define STR(s) TO_STR(s)
printf("%s\n",STR(sssss)); // 输出sssss
(2)##
这个运算符可以把两个语言符号组合成单个语言符号。
例子:
#define xval(num) x##num
#define print_x(num) printf("x"#num" = %d\n",x##num)
int xval(1)=10; // 等价于 int x1=10
print_x(1); // 等价于 printf("x1 = %d",x1)
4.易错点
#define mul(a,b) a*b
printf("%d\n",mul(1+2,3)); // 输出结果为7,思考原因
5.总结
(1) 宏定义的本质是替换。如上述 mul 宏,最终替换结果为 1+2 * 3,故输出7。
(2) 宏定义不是语句,在行末不必加分号,若加上分号则连分号也一起替换。
(3) 宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名。在宏展开时由预处理程序层层代换。
例如:
#define N 10000
#define NN N*N
(4) 可用宏定义表示数据类型,使书写方便。但与 typedef 意义不同,宏只是简单的字符替换,而 typedef 则是给数据类型起别名。
例如:
#define int func
typedef int func; // 此时用法相同
#define void (*p)() func // error!
typedef void (*func)() // correct