C语言的编译过程
预处理器将 #include 包含的文件展开成源文件,将需要的函数原型和变量包含进来。
自定义头文件
#include "xxx"
引号中可以填写相对路径的头文件。编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。双引号兼容<>。
#include <xxx>
<>编译器跳过本地路径,直接到系统路径下查找头文件。
在CMakeLists.txt文件中配置搜索路径
include_directories("xxxx") 将xxx目录加入到搜索目录。
宏函数
#include "stdio.h"
#define Max(a, b) a > b? a : b
int main(){
int max = Max(10, 5);
printf("max %d\n", max);
}
注意:
宏函数会原封不动的替换传进去的参数,如下
#include "stdio.h"
#define Max(a, b) a > b? a : b
int main() {
int max = Max(1, Max(2, 3));
printf("max %d\n", max);
}
替换完成以后:
1 > 2 > 3 ? 2 : 3 ? 1 : 2 > 3 ? 2 : 3
结果输出:
max 1
所以需要将参数加上括号:
#include "stdio.h"
#define Max(a, b) (a) > (b)? (a) : (b)
int main() {
int max = Max(1, Max(2, 3));
printf("max %d\n", max);
}
结果输出:
max 3
多行宏函数
多行用 \ 换行
#include <stdio.h>
// 判断是否是16进制中的数字
#define is_hex_char(ch) \
'0' <= ch && '9' >= ch || \
'a' <= ch && 'f' >= ch || \
'A' <= ch && 'F' >= ch
int main() {
printf("is hex ? %d\n", is_hex_char('0')); // 1
printf("is hex ? %d\n", is_hex_char('5')); // 1
printf("is hex ? %d\n", is_hex_char('9')); // 1
printf("is hex ? %d\n", is_hex_char('a')); // 1
printf("is hex ? %d\n", is_hex_char('d')); // 1
printf("is hex ? %d\n", is_hex_char('f')); // 1
printf("is hex ? %d\n", is_hex_char('g')); // 0
printf("is hex ? %d\n", is_hex_char('A')); // 1
printf("is hex ? %d\n", is_hex_char('D')); // 1
printf("is hex ? %d\n", is_hex_char('F')); // 1
printf("is hex ? %d\n", is_hex_char('G')); // 0
}
宏函数的参数类型
宏函数的参数和返回值类型没有数据类型的概念