一、预处理命令-宏定义
1.定义符号常量
#define PI 3.14
#define MAX_N 100
2.定义傻瓜表达式
#define MAX(a,b) (a > b ? a : b)
#define S(a, b) a * b
3.定义代码段
#define P(a) {\
printf("%d", a);\
}
二、预处理命令-预定义的宏
宏 | 说明 |
---|---|
__ DATA__ | 日期 : M mm_dd_yyyy |
__ TIME__ | 时间 :hh:mm:ss |
__ LINE__ | 行号 |
__ func__ | 函数名/非标准 |
__ FUNC__ | 函数名/非标准 |
__ PRETTY_FUNCTION__ | 更详细的函数信息/非标准 |
三、预处理命令-条件式编译
函数 | 说明 |
---|---|
#ifdef DEBUG | 是否定义了 DEBUG 宏 |
#ifndef DEBUG | 是否没定义了 DEBUG 宏 |
#if MAX == 5 | 宏 MAX 是否等于 5 |
#elif MAX == 3 | 宏MAX是否等于 3 |
#else | 否则 |
#endif | 条件式编译最后需要些 |
四、练习
1.实现MAX宏,需要通过如下测试
1、MAX(2,3); --> 3
2、5 + MAX(2,3); --> 8
3、MAX(2, MAX(2,3)); --> 3
4、MAX(2, 3 > 4 ? 3 : 4); --> 4
5、MAX(a++, 6) a的初始值为7,函数返回值为7,a的值变为8
注:
展示预编译后的代码(可查看宏所替换生成的代码)
g++ -E file.cpp
代码实现如下:
#include <stdio.h>
// __typeof(a) 根据参数a
#define MAX(a,b) ({\
__typeof(a) _a = a;\
__typeof(b) _b = b;\
_a > _b ? _a : _b;\
})
// #a 将a的内容字符串话
#define P(a) {\
printf("%s = %d\n", #a, a);\
}
int main() {
int a = 7;
P(MAX(2,3));
P(5 + MAX(2,3));
P(MAX(2, MAX(2,3)));
P(MAX(2, 3 > 4 ? 3 : 4));
P(MAX(a++, 6));
P(a);
}
2.实现一个打印LOG的函数,需要输出所在函数及行号信息。
注:
__FILE__ 以字符串的形式返回所在文件名称
__func__ 以字符串的形式返回所在函数的名称
__LINE__ 以整数形式返回代码行号
在编译前预定义DEBUG
g++ -DDEBUG file.cpp
代码实现如下
#include <stdio.h>
// #define DEBUG
// ## 链接
#ifdef DEBUG
#define log(frm, args...) {\
printf("\033[32m[%s : %s : %d][0m ", __FILE__, __func__, __LINE__);\
printf(frm, ##args);\
printf("\n");\
}
#else
#define log(frm, args...)
#endif
#define contact(a, b) a##b
int main() {
int a = 123;
printf("%d\n", a);
log("%d", a);
log("hello world");
int abc, def;
int abcdef = 0;
contact(abc, def) = 123456;
log("%d", abcdef);
return 0;
}
3.宏相关的代码演示
#include <stdio.h>
#define COLOR(a, b) "\033[" #b "m" a "\033[0m"
#define GREEN(a) COLOR(a, 32)
#define RED(a) COLOR(a, 31)
#define YELLOW(a) COLOR(a, 33)
// 泛型宏 _Generic((a), )
#define TYPE_STR(a) _Generic((a),\
int : "%d",\
double : "%lf",\
char : "%c"\
)
// 将此宏__attribute__下面的函数先于main函数去执行
__attribute__((constructor))
int add() {
int a = 123, b=456;
printf(RED("%d + %d = %d\n"), a, b, a + b);
return a + b;
}
int main() {
int a = 2;
double b = 3.14;
char c = 'a';
printf(GREEN("a = %d, b = %lf, c = %c\n"), a, b, c);
printf(TYPE_STR(a), a);
printf("\n");
printf(TYPE_STR(b), b);
printf("\n");
printf(TYPE_STR(c), c);
printf("\n");
return 0;
}