【C语言】常用的预处理指令总结

文章目录

  • 一、宏
    • 1. 宏常量
    • 2. 宏函数
    • 3. #undef
    • 4. 易错点一
    • 5. 易错点二
    • 6. 注意事项
    • 7. 宏的缺点
  • 二、条件编译
    • 1. 单分支
    • 2. 多分支
    • 3. 更多用法
  • 三、头文件包含
    • 1. 标准库头文件包含
    • 2. 非标准库头文件包含
  • 四、实用小技巧

一、宏

1. 宏常量

#define A B

将代码中的所有A替换成B

如果 B 过长,可以分成几行写。
除了最后一行,每行后面都要加续行符 \

【C语言】常用的预处理指令总结_第1张图片

2. 宏函数

#define func_name(para_list) stuff

注意参数列表的左括号必须紧邻函数名。

3. #undef

该指令用于移除 #define 的定义。

比如:

#define N 10
#undef N

4. 易错点一

在定义宏常量的时候,不要在最后加上 ;

例子:
【C语言】常用的预处理指令总结_第2张图片
这样会多一个;,if 语句后面就会多一个空语句,导致悬空 else。

5. 易错点二

#define 的本质是替换。

例子:
【C语言】常用的预处理指令总结_第3张图片
输出结果是5*2+3=13,而非5*5=25

因此使用宏的时候,习惯上建议多加括号:每个都加,整体再加。
例子:

#define DOUBLE(x)  ((x) + (x))

6. 注意事项

预处理器查找宏定义的符号时,不会查找字符串里的内容。

7. 宏的缺点

  1. 不能调试,容易出错。
  2. 没有类型检查,不够安全。

二、条件编译

条件编译,就是条件为真才编译。

1. 单分支

#if exp
//...
#endif

例子:
【C语言】常用的预处理指令总结_第4张图片
条件为真,屏幕上成功打印出内容。

【C语言】常用的预处理指令总结_第5张图片
条件为假,不编译。

2. 多分支

#if 常量表达式
//...
#elif 常量表达式
//...
#else
//...
#endif

3. 更多用法

条件编译还可以判断某符号是否被#define定义。

#ifdef N
//..
#endif


#ifndef N
//..
#endif

上述代码中,如果N被定义,则#ifdef条件为真,#ifndef则相反。

还有一种写法,与之完全等价。

#if defined(N)//#ifdef N
//...
#endif


#if !defined(N)//#ifndef N
//...
#endif

三、头文件包含

1. 标准库头文件包含

编译器会直接去标准库目录查找。

#include 

2. 非标准库头文件包含

先在用户的工作目录找,没找到再去标准库目录查找。

#include "filename.h"

于是我们发现,标准库头文件似乎也可以使用 "" 的形式包含。
但是这样做的效率就会低一些,因为要先在用户的工作目录查找,然后才去标准库目录查找。而且这样的代码可读性较低,无法直接判断是否是标准库头文件。

四、实用小技巧

在写项目的时候,我们有时会不可避免地重复包含头文件。
这样会导致同一个头文件多次编译,损失了效率,还可能出现重定义的问题。

我们可以用条件编译的方式来避免多次编译。

#ifndef 头文件名
#define 头文件名
//...
#endif

或者使用 #pragma once 指令。
但这种方式依赖于编译器,可移植性较差。
而且只能操作整个文件,不能局部控制,不够灵活。

#pragma once
//...

你可能感兴趣的:(C语言,c语言,开发语言)