C语言之预处理

目录

一、预处理命令

文件包含命令

二、宏定义

带参宏定义

宏参数的字符串化、连接

预定义宏

三、条件编译

#if 命令

#ifdef 命令

#ifndef 命令

四、#ererror命令

五、自定义头文件


一、预处理命令

C语言源文件要经过编译、链接才能生成可执行程序:

编译(Compile)会将源文件(.c文件)转换为目标文件。对于VC/VS,目标文件后缀为 .obj;对于GCC,目标文件后缀为 .o。 编译是针对单个源文件的,一次编译操作只能编译一个源文件,如果程序中有多个源文件,就需要多次编译操作。

链接(Link)是针对多个文件的,它会将编译生成的多个目标文件以及系统中的库、组件等合并成一个可执行程序。

在实际开发中,有时候在编译之前还需要对源文件进行简单的处理,称为预处理(即预先处理、提前处理)。

预处理指令是以#号开头的代码行,#号必须是该行除了任何空白字符外的第一个字符。#后是指令关键字,在关键字和#号之间允许存在任意个数的空白字符,整行语句构成了一条预处理指令,该指令将在编译器进行编译之前对源代码做某些转换。

预处理命令要放在所有函数之外,而且一般都放在源文件的前面。

预处理是C语言的一个重要功能,由预处理程序完成。当对一个源文件进行编译时,系统将自动调用预处理程序对源程序中的预处理部分作处理,处理完毕自动进入对源程序的编译。

编译器会将预处理的结果保存到和源文件同名的.i文件中,例如 main.c 的预处理结果在 main.i 中。和.c一样,.i也是文本文件,可以用编辑器打开直接查看内容。

文件包含命令

#include是文件包含命令,主要用来引入对应的头文件。

#include的处理过程很简单,就是将头文件的内容插入到该命令所在的位置,从而把头文件和当前源文件连接成一个源文件,这与复制粘贴的效果相同。

#include有两种使用方式,包含标准库的头文件建议用尖括号,包含自定义的头文件建议用双引号。

一个#include命令只能包含一个头文件,多个头文件需要多个#include命令。

文件包含允许嵌套,也就是说在一个被包含的文件中又可以包含另一个文件。

二、宏定义

宏定义是预处理命令的一种,它允许用一个标识符来表示一个字符串。

宏定义的一般格式:

#define 宏名 字符串

在编译预处理时,对程序中所有出现的“宏名”,都用宏定义中的字符串去代换,这称为“宏代换”或“宏展开”。宏定义是由源程序中的宏定义命令#define完成的,宏代换是由预处理程序完成的。

宏名是标识符的一种,命名规则和标识符相同。宏定义是用宏名来表示一个字符串,在宏展开时又以该字符串取代宏名,这只是一种简单的替换。字符串中可以含任何字符,但它不需要双引号,预处理程序对它不作任何检查,如有错误,只能在编译已被宏展开后的源程序时发现。

宏定义不是说明或语句,在行末不必加分号,如加上分号则连分号也一起替换。

宏定义必须写在函数之外,其作用域为宏定义命令起到源程序结束,如要终止其作用域可使用#undef命令:

#define PI 3.14159
int main(){……}
#undef PI

宏名在源程序中若用引号括起来,则预处理程序不对其作宏代换:

#define OK 100
……
printf("OK\n");

宏定义允许嵌套,在宏定义的字符串中可以使用已经定义的宏名,在宏展开时由预处理程序层层代换。

习惯上宏名用大写字母表示,以便于与变量区别,但也允许用小写字母。

 

带参宏

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值