0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

C语言程序时经常使用库函数之前的预处理是什么?

GReq_mcu168 来源:CSDN 作者:木槿花better 2021-04-16 09:47 次阅读

我们在写C语言程序时经常使用库函数之前,应该用#include引入对应的头文件。这种以#号开头的命令称为预处理命令。但是你对C语言的预处理了解多少呢?快来跟着斌哥一起学习一下C语言中的预处理吧!推荐关注下方公众号学习更多电子技术知识!

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

a0257bc0-9e2c-11eb-8b86-12bb97331649.png

还有下列几种预处理宏(是双下划线)

__LINE__ 表示正在编译的文件的行号__FILE__表示正在编译的文件的名字__DATE__表示编译时刻的日期字符串__TIME__ 表示编译时刻的时间字符串__STDC__ 判断该文件是不是定义成标准 C 程序

二、预处理有什么用?在集成开发环境中,编译,链接是同时完成的。其实,C语言编译器在对源代码编译之前,还需要进一步的处理:预编译。

所以,完整的步骤是:预编译 -》 编译 -》 链接预编译的主要作用如下:

1.将源文件中以”include”格式包含的文件复制到编译的源文件中。2.用实际值替换用“#define”定义的字符串。3.根据“#if”后面的条件决定需要编译的代码。

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

预处理的行为是由指令控制的。这些指令是由#字符开头的一些命令。

#define指令定义了一个宏---用来代表其他东西的一个命令,通常是某一个类型的常量。预处理会通过将宏的名字和它的定义存储在一起来响应#define指令。当这个宏在后面的程序中使用到时,预处理器”扩展”了宏,将宏替换为它所定义的值。例如:下面这行命令:

1#define PI 3.141592654

#include指令告诉预处理器打开一个特定的文件,将它的内容作为正在编译的文件的一部分“包含”进来。例如:下面这行命令:

1#include《stdio.h》

指示预处理器打开一个名字为stdio.h的文件,并将它的内容加到当前的程序中。

预处理器的输入是一个C语言程序,程序可能包含指令。预处理器会执行这些指令,并在处理过程中删除这些指令。预处理器的输出是另外一个程序:原程序的一个编辑后的版本,不再包含指令。预处理器的输出被直接交给编译器,编译器检查程序是否有错误,并经程序翻译为目标代码。

三、3种预处理详解1、宏定义指令

宏定义了一个代表特定内容的标识符。预处理过程会把源代码中出现的宏标识符替换成宏定义时的值。宏最常见的用法是定义代表某个值的全局符号。宏的第二种用 法是定义带参数的宏(宏函数),这样的宏可以象函数一样被调用,但它是在调用语句处展开宏,并用调用时的实际参数来代替定义中的形式参数。

1.1 #define指令

1.1.1 #define预处理指令用来定义宏。该指令最简单的格式是:声明一个标识符,给出这个标识符代表的代码(比如像圆周率这样的数)。在后面的源代码中,我们就可以使用定义的宏取代要使用的代码,代码举例:

#define PI 3.141592654

1.1.2 使用宏的好处有两点

一是使用方便。如下:

#define PI 3.1415926

PI显然比3.1415926写着方便。

二是定义的宏有了意义,可读性强。如例1,MAX_NUM,望文生意便知是最大数量的意思,比单纯使用10这个数字可读性要强的多。

三是容易修改。如例1,如果在程序中有几十次会使用到MAX_NUM,修改只需要在宏定义里面修改一次就可以,否则你会修改到崩溃。

2、条件编译指令

程序员可以通过定义不同的宏来决定编译程序对哪些代码进行处理。条件编译指令将决定哪些代码被编译,而哪些是不被编译的。可以根据表达式的值或者某个特定的宏是否被定义来确定编译条件。

2.1 #if/#endif/#else/#elif指令

#if指令检测跟在制造另关键字后的常量表达式。如果表达式为真,则编译后面的代码,直到出现#else、#elif或#endif为止;否则就不编译。

#endif用于终止#if预处理指令。#else指令用于某个#if指令之后,当前面的#if指令的条件不为真时,就编译#else后面的代码。

代码举例

#define DEBUG //此时#ifdef DEBUG为真//#define DEBUG 0 //此时为假int main(){ #ifdef DEBUG printf(“Debugging

”); #else printf(“Not debugging

”); #endif printf(“Running

”); return 0;}

这样我们就可以实现debug功能,每次要输出调试信息前,只需要#ifdef DEBUG判断一次。不需要了就在文件开始定义#define DEBUG 0

#elif预处理指令综合了#else和#if指令的作用。

3、头文件包含指令

采用头文件的目的主要是为了使某些定义可以供多个不同的C源程序使用。因为在需要用到这些定义的C源程序中,只需加上一条#include语句即可,而不必再在此文件中将这些定义重复一遍。预编译程序将把头文件中的定义统统都加入到它所产生的输出文件中,以供编译程序对之进行处理。

#include预处理指令的作用是在指令处展开被包含的文件。包含可以是多重的,也就是说一个被包含的文件中还可以包含其他文件。标准C编译器至少支持八重嵌套包含。预处理过程不检查在转换单元中是否已经包含了某个文件并阻止对它的多次包含,这个的处理办法上面已经给出。

在程序中包含头文件有两种格式:

#include 《my.h》 #include “my.h”

第一种方法是用尖括号把头文件括起来。这种格式告诉预处理程序在编译器自带的或外部库的头文件中搜索被包含的头文件。第二种方法是用双引号把头文件括起 来。这种格式告诉预处理程序在当前被编译的应用程序的源代码文件中搜索被包含的头文件,如果找不到,再搜索编译器自带的头文件。

采用两种不同包含格式的理由在于,编译器是安装在公共子目录下的,而被编译的应用程序是在它们自己的私有子目录下的。一个应用程序既包含编译器提供的公共 头文件,也包含自定义的私有头文件。采用两种不同的包含格式使得编译器能够在很多头文件中区别出一组公共的头文件。

四、小结预编译程序所完成的基本上是对源程序的“替代”工作。经过此种替代,生成一个没有宏定义、没有条件编译指令、没有特殊符号的输出文件。这个文件的含义同没有经过预处理的源文件是相同的,但内容有所不同。下一步,此输出文件将作为编译程序的输出而被翻译成为机器指令。

原文标题:C语言预处理命令你知道多少?

文章出处:【微信公众号:玩转单片机】欢迎添加关注!文章转载请注明出处。

责任编辑:haq

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • C语言
    +关注

    关注

    180

    文章

    7597

    浏览量

    136121
  • 预处理
    +关注

    关注

    0

    文章

    33

    浏览量

    10470

原文标题:C语言预处理命令你知道多少?

文章出处:【微信号:mcu168,微信公众号:硬件攻城狮】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    C预处理器及其工作原理

    C预处理器(C Pre-Processor)也常简写为 CPP,是一个与 C 编译器独立的小程序,预编译器并不理解
    的头像 发表于 03-12 14:14 577次阅读
    <b class='flag-5'>C</b><b class='flag-5'>预处理</b>器及其工作原理

    C语言#define的应用

    C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成
    发表于 03-06 11:29 338次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用

    C语言中的预处理

    所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。
    发表于 03-01 12:16 818次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>中的<b class='flag-5'>预处理</b>器

    为什么我的电脑在烧录程序时经常蓝屏?

    为什么我的电脑在烧录程序时经常蓝屏
    发表于 01-19 07:27

    C语言构建高效的嵌入式程序

    嵌入式工程师在编写C语言程序时,需要注重效率和清晰的思路。本文将通过解析经典问题“猴子选大王”来展示如何用C语言思维方式构建高效、清晰的
    的头像 发表于 12-21 09:27 595次阅读

    C语言有哪些预处理操作?

    C语言预处理是在编译之前对源代码进行处理的阶段,它主要由预处理器完成。
    的头像 发表于 12-08 15:40 582次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>有哪些<b class='flag-5'>预处理</b>操作?

    C语言必备知识编译预处理

    编译预处理就是在编译源代码之前进行的一系列处理,将源程序中的一些特殊命令进行展开或处理,生成扩展的源代码。这些特殊命令通常以“#”开头,占单
    的头像 发表于 12-01 18:27 1024次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>必备知识编译<b class='flag-5'>预处理</b>

    c语言程序的基本单位

    C语言程序的基本单位是函数函数是一组有关联的语句和表达式的集合,它们一起完成特定的任务。在C
    的头像 发表于 11-26 09:05 2017次阅读

    如何把c语言程序变成应用程序

    的,并且通常以.c作为文件扩展名。源代码包括函数、变量和其他语句,它们被编译器翻译成机器代码,然后在计算机上执行。 编写C语言源代码时,需要遵循C
    的头像 发表于 11-26 09:04 3350次阅读

    c语言函数函数体用什么符号括起来

    函数 是指将一组能完成一个功能或多个功能的语句放在一起的 代码结构 。 在 C语言程序 中,至少会包含一个函数,及主
    的头像 发表于 11-24 15:52 667次阅读
    <b class='flag-5'>c</b><b class='flag-5'>语言</b>中<b class='flag-5'>函数</b>的<b class='flag-5'>函数</b>体用什么符号括起来

    c语言程序main函数的位置

    C语言程序中的main函数程序的入口点,它被认为是C语言
    的头像 发表于 11-24 10:23 2307次阅读

    c语言程序的基本单位

    C语言程序的基本单位是函数函数是一组语句的集合,用于完成特定的任务。每个C
    的头像 发表于 11-24 10:20 1556次阅读

    c语言gets函数可以输入数字吗

    C语言中的gets函数是用来读取字符串的,而不是用来读取数字的。它会读取输入的字符直到遇到换行符或者文件结束符。因此,如果你尝试使用gets函数来读取数字,是无法准确获取数字本身的。
    的头像 发表于 11-24 10:00 1446次阅读

    \0在c语言中怎么用

    C语言是一种广泛使用的程序设计语言,具有高效、简洁和可移植等特点。本文将详尽介绍C语言的基本语法、数据类型、控制结构、
    的头像 发表于 11-24 09:59 3004次阅读

    scanf在C语言中的作用

    scanf在C语言中的作用  scanf是C语言中的输入函数,用于从标准输入设备(如键盘)读取数据,并将其存储到变量中。它是
    的头像 发表于 11-23 14:13 1295次阅读