C语言学习12:预处理器

张建 lol

C 预处理器

预处理器 不是 编译器的组成部分,是编译过程的一个单独的步骤。简言之,C预处理器是一个 文本替换工具,它会指示编译器在实际编译前完成所需的 预处理;我们把 C 预处理器(C Preprocessor) 简写成(CPP)

所有的预处理器都是以 # 开头,非空字符,为增加可读性,从第一列开始,下面列出了所有的预处理命令:

预处理实例

#define MAX_LENGTH 20

这个指令告诉 CPP 把所有的 MAX_LENGTH 定义为 20,使用 #define 定义常量来增强可读性

1
2
#include <stdio,h>
#include "myheader.h"

这个指令告诉 CPP系统库 中读取 stdio.h,并添加到 当前源文件 中;下一行告诉 CPP本地目录 中获取 myheader.h,并添加到 当前源文件中

1
2
#undef FILE_SIZE
#define FILE_SIZE 30

这个指令告诉 CPP 取消已定义的 FILE_SIZE,并定义它为 30

1
2
3
#ifndef MESSAGE
#define MESSAGE "You wish!"
#endif

这个指令告诉 CPP 只要当 MESSAGE 未定义时,才定义 MESSAGE

1
2
3
#ifdef DEBUG
/*debug here*/
#endif

这个指令告诉 CPP ,如果定义了 DEBUG,则执行语句。

预定义宏

ANSI C 定义了许多宏

1
2
3
4
5
6
7
8
9
10
11
#include <stdio.h>

main()
{
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );

}

当上面的代码在 main.c 中编译和执行时,它会产生下列结果:

1
2
3
4
5
6
File :/Users/mac/Desktop/预处理器/预处理器/main.m
Date :Feb 18 2023
Time :13:22:02
Line :16
ANSI :1
Program ended with exit code: 0

预处理器运算符

  • 宏延续运算符 ()

一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用 宏延续运算符(\)。例如:

1
2
#define msg(a,b) \
printf(#a "and" #b "\n")
  • 字符串常量化运算符(#)

在宏定义中,把一个 宏参数 转为 字符串常量

在 main.c 中 编译和运行上面的代码,得到下面的结果

1
1and'a'
  • 标记粘贴运算符(##)

宏定义内标记粘贴运算符(##)会合并两个参数

参数化宏

#define square(x) (x*x)

1
2
#define max(x,y) \
printf("%d\n",x>y?x:y);
  • Post title:C语言学习12:预处理器
  • Post author:张建
  • Create time:2023-02-15 00:13:38
  • Post link:https://redefine.ohevan.com/2023/02/15/C学习/C语言学习12:预处理器/
  • Copyright Notice:All articles in this blog are licensed under BY-NC-SA unless stating additionally.