编译预处理是源代码在真正被全部gcc编译之前,编译器就要事先做的工作

宏定义

C提供了一种可以替换源代码中的字符串的机制

语法:#define 宏名(参数表) 宏值

不带参数宏定义

1
2
3
4
#define PI 3.1415926
#define SIDE 10
#define AREA SIDE*SIDE
#define PR printf("ethaniel\n");

带参数的宏定义

1
2
#define MIX(a) (a) * (a)
#define MAX(a,b) a>b?a:b

文本包含

文件目录:
header.h

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#ifndef HEADER_H
#define HEADER_H

#include <stdio.h>

void pr();//函数声明

/*
使用特定的.h头文件,完成所有相关内容的声明
1、宏定义
2、其他常用头文件的包含
3、结构体、共用体(联合体)、枚举类型的定义
4、外部函数的声明
5、全局变量声明
6、typedef声明
*/
// 分文件写的项目. 编译时,使用gcc *.c编译所有文件

#endif

main.c

1
2
3
4
5
6
7
#include "header.h"

int main()
{
pr();
return 0;
}

pr.c

1
2
3
4
5
6
7
#include "header.h"
//函数定义、函数实现
void pr()
{
printf("ethaniel\n");
return;
}

条件编译

根据条件是否成立,来确定代码是否参与编译

(1)单分支

1
2
3
#if 条件
若干语句;
#endif
1
2
3
#ifndef 条件
若干语句;
#endif

(2)双分支

1
2
3
4
5
#if 条件
若干语句1;
#else
若干语句2;
#endif
1
2
3
4
5
#ifndef 条件
若干语句1;
#else
若干语句2;
#endif

(3)多分支

1
2
3
4
5
6
7
8
9
10
11
#if 条件1
若干语句1;
#elif 条件2
若干语句2;
#elif 条件3
若干语句3;
#elif 条件4
若干语句4;
#elif 条件5
若干语句5;
#endif
1
2
3
4
5
6
7
8
9
10
11
#ifndef 条件1 //是否被定义
若干语句1;
#elif 条件2
若干语句2;
#elif 条件3
若干语句3;
#elif 条件4
若干语句4;
#elif 条件5
若干语句5;
#endif
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
#define AAA
#include <stdio.h>
int main()
{
#if 3>1
printf("a\n");//条件成立输出a
#endif

#ifndef AAA
printf("e\n");
#else BBB
printf("t\n");//打印t,因为BBB没有被定义过
#endif
printf("-----\n");
return 0;
}