C语言---C语言预处理指令与条件编译

C语言预处理指令

C语言规定:源程序中可以加入一些预处理指令。但预处理指令并不是C语言本身的组成部分,编译器不能识别它们,不能直接对这些指令进行编译。在使用时需要以“#”开头,用以与C语言区分。

所谓预处理,就是指源程序在进行编译的第一遍扫描(词法分析和语法分析)之前所做的工作由预处理程序完成。当对一个源程序进行编译时,系统将自动引用预处理程序对源程序中的预处理部分进行处理(代替),处理完毕自动进入对源程序的编译

C语言宏定义

在C语言源程序中允许用一个标识符来表示字符串,称为宏。宏定义是以“#”开头的,均为预处理命令,同时使用“define”作为宏定义命令。宏定义,根据标识符的形式,大体可以分成两种,分别是变量式宏定义和函数式宏定义。变量式宏定义的书写类似于变量的声明,用来定义常量;函数式宏定义的书写类似于函数,用来定义稍复杂些的带参数的表达式。

变量式宏定义

变量式宏定义也就是不带参数的宏定义,其定义的一般形式为:

#define 标识符 字符串

其中:字符串部分可以为浮点数、运算符、字符串、表达式等。比如:

#define PI 3.1415926
#define LARGE >
#define NEWLINE "\n"
#define M (x*x+2*x)

在使用标识符代替表达式的时候,需要注意:

在表达式中出现了x,那么在主函数中必须定义变量x,否则就会编译错误;
宏定义中,表达式两边的括号不能少,否则可能会发生错误。
文件中的宏定义默认是从定义就有效到文件结束,但也可以对其作用范围进行圈定,使用的方法为:

#define                /* 宏定义开始 */
    ...                /* 宏定义内容 */
#undef                /* 宏定义结束 */

宏定义嵌套
在宏定义的过程中,宏也是可以嵌套定义的。比如:

#define A (1+2)
#define B A*A
#define C B+B
#define A (1+2)
#define B (1+2)*(1+2)
#define C (1+2)*(1+2)+(1+2)*(1+2)

函数式宏定义
函数式宏定义也就是带参数的宏定义,其定义的一般形式为:

#define MAX(a,b) a>b?a:b
#define MUL(a,b) (a*b)

宏函数和函数之间的主要区别:

两者的定义形式不同:宏定义中只需要给出形式参数,不需要给出形式参数的类型,而在函数定义的时候,必须给出类型;
宏函数是由预处理程序处理的,而函数是由编译程序处理的。宏程序调用的时候,仅仅作简单的替代,不作任何计算,而且是在编译之前。函数是在编译之后,在目标程序执行期间,依次求出实参的值,再执行调用;
函数调用的时候,不需要求实参的类型和形参的类型相一致。而宏函数则不作任何检查;
函数可以使用return进行返回一个值,宏函数不返回值

C语言文件包含

文件包含指令的功能是把指定的文件插入该指令行位置取代指令行,从而把指定的文件和当前的源文件连成一个源文件。我们通常以头文件来编写这些被包含的文件,也就是以.h作为这些文件的扩展名。当然不是非要这样命名才可以。也可以使用.c为扩展名,或者干脆不写扩展名,这样都是允许的。只是使用.h更为普遍而已。

#include "文件名"
#include <文件名>

两种文件包含方式的区别:

<>:文件包含标准头文件。搜索顺序是:从系统目录下开始搜索,然后再搜索PATH环境变量所列出的目录,不搜索当前目录。如stdio.h、assert.h、stdlib.h等;
“”:文件包含自定义文件。搜索顺序是:从当前目录开始搜索,然后是系统目录和PATH环境变量所列出的目录。如led.h、usart.h、dac.h等

C语言条件编译

所谓“条件编译”,就是程序的内容指定编译的条件。一般情况下,源程序的所有行都参与编译,但是我们希望部分行在满足一定条件的情况下再进行编译,这就要用到条件编译。

一般条件编译的形式有**#ifdef、#ifndef、#if**三种形式,下面依次介绍:

#ifdef形式的一般形式如下:

#ifdef 标识符
    程序段1
#else
    程序段2
#endif

作用是:如果标识符已经被定义了,则对程序段1进行编译;否则编译程序段2。但也可以不写#else分句,也是没有问题的。

其中:标识符是用#define指令进行定义的,程序段可以是语句,可以是命令行。

#ifndef形式的一般形式如下:

#ifndef 标识符
    程序段1
#else
    程序段2
#endif

作用是:如果标识符没有被定义了,则对程序段1进行编译;否则编译程序段2。但也可以不写#else分句,也是没有问题的

#if形式的一般形式如下:

#if 表达式
    程序段1
#else
    程序段2
#endif

ref:https://blog.csdn.net/qq_38410730/article/details/80249460

猜你喜欢

转载自blog.csdn.net/weixin_43491077/article/details/114548156
今日推荐