宏定义
宏定义的格式如下#define 标识符 替换内容
主要有三种类型
-
定义常量符号:
#define PI 3.1415926
-
定义简单表达式:
#define add(a,b) a+b
-
定义代码段
#define func(a) { \ printf("hello %s", a); \ }
由于宏在预处理阶段仅仅是做简单的替换,因此有时候会出现一些问题,例如如下代码define.cc
#include <cstdio> #define add(a,b) a+b int main(){ printf("add(3,4)*5 = %d\n",add(3,4)*5); return 0; }
由于add(3,4)仅仅是做简单替换,因此实际上被编译的源码是
printf("add(3,4)*5 = %d\n",3+4*5)
,可以通过g++ -E define.cc -o tmp.cc
查看main函数里面实际被编译的代码:# 4 "define.cc" int main(){ printf("add(3,4)*5 = %d\n",3 +4*5); return 0; }
编译器的内置宏定义
宏 说明 __DATE__
日期:Mmm dd yyyy __TIME__
时间:hh:mm:ss __LINE__
行号 __FILE__
文件名 __func__
函数名/不是所有编译器都支持 __FUNC__
函数名/不是所有编译器都支持 __PRETTY_FUNCTION__
更详细的函数信息/不是所有编译器都支持 简单引用示例,定义一个log函数,显示文件名、函数名以及对用的行数,并将以上信息用绿色字体表示
#include<cstdio> #define LOG(frm,args...) {\ printf("\033[0;32m[%s:%s:%d]\033[0m",__FILE__,__func__,__LINE__);\ printf(frm,##args);\ printf("\n");\ } int main(){ LOG("add(3,4)*5 %s %d\n","=",add(3,4)*5); LOG("hello,world"); // `##args`用来支持可变参数为空的情况 return 0; }
以上LOG 宏定义中
args...
是可变参数,##args
用来支持可变参数为空的情况