C语言预处理指令

预处理指令简介
1、C语言在对源程序进行编译之前,会先对一些特殊的预处理指令做解释,产生一个新的源程序(这个过 程叫 做预编译处理),之后再进行通常的编译。
2、为了区分预处理指令和一般c语言的语句,所有预处理指令都以"#"开头,并且结尾不用封号
3、预处理指令可能出现在程序的任何位置,它的作用范围是从它出现的位置到文件尾。习惯上我们尽可能 将预处理指令写在源程序的开头,这种情况下,它的作用范围就是整个源程序文件。
4、C语言提供的预处理指令主要由:宏定义、文件包含、条件编译。
一、宏定义
宏定义包括两种:有参数和没参数
#define NUM 6
#define sum (a,b)    ( (a)*(b) ) //相当于一个函数,返回a*b
注意:1、宏定义带参数时一定要把参数用括号括起来,不然很容易出错。因为宏定义就是单纯的字符替换 (没有类型检测),如                   果括号用的不正确,计算的优先级很容易出错。
   2、宏定义是在编译之前替换,而函数实在程序运行时调用, 所以宏定义效率要比函数高

宏定义可以出现在程序的任何地方,从他出现的位置开始起作用,一般用来定义常量。

二、条件编译
情况一:满足条件后会把对应的代码进行编译(一般的后面的条件是宏定义而不是变量)。
#if 条件1
...code ...
#elif 条件2         
...code ...
#else 
 ...code...
#endif

情况二:如果已经定义了宏MAX,则编译响应代码
#if defined (MAX)
...code ...
#endif
        或者
#ifdef MAX
...code ...
#endif
情况三:如果没定义宏,则执行代码
#ifndef (MAX)
...code ...
#endif
        或者
#if !defined (MAX)
...code ...
#endif

三、文件包含
1、#include :将一个文件的内容全部拷贝到另一文件中;
情况一: 直接到C语言库函数头文件所在的目录中寻找文件
#include  <文件名>
情况二:系统会在源程序当前目录下寻找,若是找不到,遭到操作系统的Path路径下查找,最后才到C语言 库函数的头文件所造目录中查找;
#include  "文件名"   // 万能的
  注意:#include指令允许嵌套包含,比如a.h包含b.h,b.h包含c.h,但是不允许递归包含,例如a.h包含 b.h,b.h包含a.c。
        防止头文件重复包含:two.h中
#ifndef _TWO_H_
#define _TWO_H_
 ...头文件内容..
#endif
### C语言中的预处理指令 #### 基本概念 C语言预处理指令是在源代码被正式编译前由预处理器执行的一组命令。它们通常以`#`号开头,用于控制源代码的行为和结构。通过合理使用预处理指令,可以显著提升程序的灵活性、可维护性和性能。 --- #### 类型及其功能 1. **文件包含** 文件包含是一种常见的预处理操作,允许程序员将其他文件的内容嵌入当前源文件中。这通常是用来引入标准库函数或其他模块的功能。 ```c #include <stdio.h> // 引入标准输入输出库 ``` 这一机制使得开发者无需重复书写常用代码片段,而是可以通过简单的声明调用外部资源[^1]。 2. **宏定义** 宏定义提供了一种替代文字的方式,可以在整个项目范围内替换特定字符串或表达式。它分为简单宏和带参数宏两种形式: - 简单宏: ```c #define PI 3.1415926 double area = PI * r * r; ``` - 参数化宏: ```c #define SQUARE(x) ((x) * (x)) int result = SQUARE(5); // 计算平方值 ``` 此外,还可以利用 `#undef` 来取消先前已存在的宏定义[^2]。 3. **条件编译** 条件编译允许根据某些条件决定是否要编译某部分代码。这对于跨平台开发或者调试非常有用。例如: ```c #ifdef DEBUG printf("Debug mode is enabled.\n"); #endif ``` 如果定义了 `DEBUG` 符号,则上述打印语句会被保留;反之则忽略该段逻辑[^3]。 --- #### 实际应用案例 以下是综合运用多种预处理技术的一个例子——实现一个支持多环境切换的日志记录工具: ```c #include <stdio.h> #define LOG_LEVEL_DEBUG 0 #define LOG_LEVEL_INFO 1 #define LOG_LEVEL_ERROR 2 #ifndef CURRENT_LOG_LEVEL #define CURRENT_LOG_LEVEL LOG_LEVEL_INFO #endif #if CURRENT_LOG_LEVEL <= LOG_LEVEL_DEBUG void log_debug(const char* message){ printf("[DEBUG]: %s\n",message); } #else #define log_debug(message) #endif int main(){ log_debug("This will only show up when debug level is active."); return 0; } ``` 在此示例中,如果未设置 `CURRENT_LOG_LEVEL` 或者其数值大于等于 `LOG_LEVEL_DEBUG` 的阈值,那么对应的调试信息就会生效;否则这部分代码将在预处理阶段移除掉。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值