C语言学习8

文章目录
  1. 1. 编译预处理
    1. 1.1. 预处理
    2. 1.2. 文件包含命令(#include的用法)
    3. 1.3. 宏定义
      1. 1.3.1. 不带参数的宏定义
      2. 1.3.2. 带参数的宏定义
      3. 1.3.3. C语言带参宏定义和函数的区别
      4. 1.3.4. C语言的预定义宏
    4. 1.4. 条件编译
      1. 1.4.1. #if的用法
      2. 1.4.2. #ifdef的用法
      3. 1.4.3. #ifndef的用法

编译预处理

本文将讲述C语言中关于预处理的相关知识。

预处理

在实际开发中,编译器在编译程序之前还需要对源文件进行简单的处理,这种简单加工过程称为 预处理 (即预先处理、提前处理)。
预处理主要是处理以#开头的命令,以#号开头的命令称为 预处理命令。预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分做处理,处理完毕自动进入对源程序的编译。编译器会将预处理的结果保存到和源文件同名的.i文件中。
C语言提供了多种预处理功能,如宏定义、文件包含、条件编译等,合理地使用它们会使编写的程序便于阅读、修改、移植和调试,也有利于模块化程序设计。

文件包含命令(#include的用法)

#include叫做文件包含命令,用于引入对应头文件(.h文件)
#include就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连成一个文件。
用法:
【列】 #include<stdHeader.h>
   #include”myHeader.h”
尖括号与双引号的区别在于头文件的搜索路径不同:
●使用尖括号<>,编译器会到系统路径下查找头文件。
●使用双引号””,编译器首先在当前目录下查找头文件,如果没有找到,再到系统路径下查找。

【注意】
●一个#include命令只能包含一个头文件,多个头文件需要多个#include命令。
●文件包含允许嵌套,即一个被包含的文件中又可以包含另一个文件。

宏定义

不带参数的宏定义

1.定义形式: #define 宏名 替换文本 或 #define 宏名
2.说明:
●在define宏名和宏替换文本之间要用空格隔开
●可以用#undef命令终止宏定义的作用域
●在进行宏定义时,可以引用已定义的宏名
●同一个宏名不能重复定义

带参数的宏定义

宏定义还可进行参数替换。
●如果程序中带有实参的宏,则按#define命令行中指定的字符串从左到右进行替换。
●如果字符串中包含宏中的形参(如 x,y)则将程序语句中相应的实参(可以是常量、变量或表达式)代替形参。
●如果宏定义中的字符串中的字符不是参数字符(如 (x*y)中的”*“号),则保留。这样就形成了置换的字符串。

C语言带参宏定义和函数的区别

带参数的宏和函数很像,但本质上有区别:宏展开仅仅是字符串的替换,不会对表达式进行计算;宏在编译之前就被处理了,没有机会参与编译,也不会占用内存。而函数是一段可以重复使用的代码,会被编译,会分配内存,每一次调用函数就是执行这块内存中的代码。

C语言的预定义宏

预定义宏 即先定义好的宏,无需再定义即直接使用。ANSI C规定的几个预定义宏如下:
_LINE_: 表示当前源代码的行号
_FILE_: 表示当前源文件的名称
_DATE_: 表示当前编译日期
_TIME_: 表示当前编译时间

条件编译

条件编译:即能够根据不同情况编译不同代码,产生不同目标文件的机制。

#if的用法

一般格式:

1
2
3
4
5
6
7
8
9
#if 整形常量表达式1
程序段1
#elif 整形常量表达式2
程序段2
#elif 整形常量表达式3
程序段3
#else
程序段4
#endif

意为:如常量 “表达式1”的值为真(非0),就对”程序段1”进行编译,否则就计算”表达式2”,结果为真(非0)就对”程序段2”进行编译,也为假,就继续往下匹配,直到遇到为真的表达式,或者最后到 #else。

#ifdef的用法

一般格式:

1
2
3
4
5
#ifdef 宏名
程序段1
#else
程序段2
#endif

意为:如果当前的宏已被定义过,则对”程序段1”进行编译,否则对”程序段2”进行编译。

#ifndef的用法

一般格式:

1
2
3
4
5
#ifndef 宏名
程序段1
#else
程序段2
#endif

意为:如果当前的宏未被定义过,则对”程序段1”进行编译,否则对”程序段2”进行编译。


版权声明

Scholar’s Blog by scholargeek is licensed under a Creative Commons BY-NC-ND 4.0 International License.
董仕麟创作并维护的scholargeek博客采用创作共用保留署名-非商业-禁止演绎4.0国际许可证

本文首发于Scholar’s Blog博客,版权所有,侵权必究。

本文永久链接:https://scholargeek.github.io/2018/02/16/C%E8%AF%AD%E8%A8%80%E5%AD%A6%E4%B9%A08/

更新日期:


本站总访问量