14.C语言-预处理器

157 阅读3分钟

一、基本介绍

预处理指令:

预处理过程中会执行预处理指令,预处理指令以 # 号开头,用于指导预处理器执行不同的任务。

预处理指令的特点:

(1)预处理指令应该放在代码的开头部分。 (2)预处理指令都以 # 开头,指令前面可以有空白字符(比如空格或制表符),# 和指令的其余部分之间也可以有空格,但是为了兼容老的编译器,一般不留空格 (3)预处理指令都是一行的,除非在行尾使用反斜杠,将其折行。 (4)预处理指令不需要分号作为结束符,指令结束是通过换行符来识别的。 (5)预处理指令通常不能写在函数内部,有些编译器的扩展允许将预处理指令写在函数里,但强烈不建议这么干。

二、宏定义#define

① 宏定义
 #define 宏名称 替换文本

宏名称满足标识符规范,建议使用大写

在预处理阶段,所有的宏名称会被替换成对应的替换文本

② 取消宏定义
 #undef 宏名称
③ 带参数的宏定义
 #define 宏名称(形参列表) 可以包含形参的替换文本
 // 带参数的宏定义 返回两个数中较大的
 #define MAX(a,b) a > b ? a : b
 ​
 // 带参数的宏 定义计算平方, 替换文本中的参数一般建议使用小括号括起来
 #define SQ1(n) n * n
 #define SQ2(n) (n) * (n)
 ​
 // 带参宏定义 实现立方计算
 #define CUBE(n) (n)*(n)*(n)
 ​
 int main()
 {
     printf("较大的数:%d \n", MAX(108, 67));  // 替换为: printf("较大的数:%d \n", 108 > 67 ? 108 : 67);
     printf("平方: %d \n", SQ1(4+3));   // 替换为: printf("平方: %d \n", 4+3 * 4+3);
     printf("平方: %d \n", SQ2(4+3));   // 替换为:printf("平方: %d \n", (4+3) * (4+3));
 }

三、#include

① 包含标准库头文件
 #include <头文件名>
② 包含自定义头文件
 #include "头文件路径"
 1. 相对路径
     目标文件(头文件)在当前文件(源文件)的同级或者下级,路径以 ./ 开头,./ 可以省略
     目标文件(头文件)在当前文件(源文件)上级、更上级,或者需要先去到上级目录,路径以 ../ 开头
         ../ 表示上一级目录
         ../../ 表示上上极目录
         ../../../ 表示上上上级目录 
 ​
 2. 绝对路径
     目标文件在计算机上绝对的位置 

类 Unix 系统中的路径使用 /, windows 系统的路径中使用 `` 或 /

四、条件编译#if

① #if

单向分支

 #if 条件
 ​
 #endif

双向分支

#if 条件

#else

#endif

多向分支

#if 条件

#elif 条件

#elif 条件

#else

#endif
② #if defined

单向分支

#if defined 宏名称

#endif

双向分支

#if defined 宏名称

#else

#endif

多向分支

#if defined 宏名称

#elif defined 宏名称

#elif defined 宏名称

#else

#endif
③ #ifdef

单向分支

#ifdef 宏名称

#endif

双向分支

#ifdef 宏名称

#else

#endif
④ #ifndef

单向分支

#ifndef 宏名称

#endif

双向分支

#ifndef 宏名称

#else

#endif
条件编译所涉及的预处理器指令
#if
#ifdef
#ifndef
#if defined
#else
#elif
#endif