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

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

3天内不再提示

C语言预处理指令及分类

strongerHuang 来源:嵌入式专栏 作者:strongerHuang 2020-11-29 10:14 次阅读

C语言编程过程中,经常会用到如 #include、#define 等指令,这些标识开头的指令被称为预处理指令,预处理指令由预处理程序(预处理器)操作。

相比其他编程语言,C/C++ 语言更依赖预处理器,故在阅读或开发 C/C++ 程序过程中,可能会接触大量的预处理指令。

1

预处理指令及分类C/C++ 程序中的源代码中包含以 # 开头的各种编译指令,这些指令称为预处理指令。预处理指令不属于 C/C++ 语言的语法,但在一定意义上可以说预处理扩展了 C/C++。

ANSI C 定义的预处理指令主要包括:文件包含、宏定义、条件编译和特殊控制等 4 类。

1. 文件包含

文件包含:#include 是 C 程序设计中最常用的预处理指令。例如,几乎每个需要输入输出的 C 程序,都要包含 #include《stdio.h》 指令,表示把 stdio.h 文件中的全部内容,替换该行指令。

包含文件的格式有 #include 后面跟尖括号 《》 和双引号 “” 之分。两者的主要差别是搜索路径的不同。

尖括号形式:如 #include《math.h》,预处理器直接到系统目录对应文件中搜索 math.h 文件,搜索不到则报错。系统提供的头文件一般采用该包含方式,而自定义的头文件不能采用该方式。

双引号形式:如 #include“cal.h”,首先到当前工作目录下查找该文件,如果没有找到,再到系统目录下查找。包含自定义的头文件,一般采用该方式。虽然系统头文件采用此方式也正确,但浪费了不必要的搜索时间,故系统头文件不建议采用该包含方式。

2.宏定义

宏定义:包括定义宏 #define 和宏删除 #undef。

以 #define 开头,可以定义无参数宏和带参的宏定义。程序中经常使用无参宏定义来定义符号常量。例如:

#define PI 3.1416 //定义无符号宏,或定义符号常量 PI

#undef 表示删除已定义的宏,例如:

#undef PI //删除前面该宏的定义

3.条件编译

条件编译:主要是为了有选择性地执行相应操作,防止宏替换内容(如文件等)的重复包含。

常见的条件编译指令有 #if、#elif、#else、#endif、#ifdef、#ifndef。

4.特殊控制

特殊控制:ANSI C 还定义了特殊作用的预处理指令,如 #error、#pragma。

#error:使预处理器输出指定的错误信息,通常用于调试程序。

#pragma:是功能比较丰富且灵活的指令,可以有不同的参数选择,从而完成相应的特 定功能操作。调用格式为:#pragma 参数。

其中,参数可以有 message 类型、code_seg、once、warning、pack 等。通常使用如下的预处理指令来设定内存以 n 字节对齐方式。

#pragma pack (n) //其中 n 称为对齐系数,取 1、2、4、8.。.

2

预处理器及其工作原理

C预处理器(C Pre-Processor)也常简写为 CPP,是一个与 C 编译器独立的小程序,预编译器并不理解 C 语言语法,它仅是在程序源文件被编译之前,实现文本替换的功能。

目前预编译器巳集成到集成开发环境中,一般并没有执行预处理操作的选项,而包含在了编译操作中,即选择编译操作时,首先调用的是预处理器,处理源程序文件中的预处理指令,预处理器的输出再送给编译器,编译器从 C 语言语法角度检查程序是否正确,如果正确,则生成目标代码文件或机器指令文件。

C 预处理器及 C 编译器的执行顺序及输入输出文件类型,如图所示:

责任编辑:lq

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

    关注

    180

    文章

    7588

    浏览量

    135740
  • C++
    C++
    +关注

    关注

    21

    文章

    2094

    浏览量

    73442
  • 预处理
    +关注

    关注

    0

    文章

    33

    浏览量

    10466

原文标题:C语言预处理命令分类和工作原理

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

收藏 人收藏

    评论

    相关推荐

    C55x CSL音频预处理

    电子发烧友网站提供《C55x CSL音频预处理.pdf》资料免费下载
    发表于 09-19 11:30 0次下载
    <b class='flag-5'>C</b>55x CSL音频<b class='flag-5'>预处理</b>

    图像识别技术包括自然语言处理

    计算机视觉技术对图像进行处理、分析和理解,从而实现对图像中的目标、场景、行为等信息的识别和理解。图像识别技术包括图像预处理、特征提取、分类器设计、模型训练等多个环节。 1.2 自然语言
    的头像 发表于 07-16 10:54 559次阅读

    nlp自然语言处理模型怎么做

    自然语言处理(Natural Language Processing,简称NLP)是人工智能领域的一个重要分支,它涉及到计算机对人类语言的理解和生成。随着深度学习技术的发展,NLP领域取得了显著
    的头像 发表于 07-05 09:59 476次阅读

    信号的预处理包括哪些环节

    信号预处理是信号处理的一个重要环节,它对信号进行一系列的操作,以便于后续的分析和处理。信号预处理的目的是提高信号的质量,减少噪声,保留有用的信息,以及满足后续
    的头像 发表于 06-03 10:35 2151次阅读

    C预处理器及其工作原理

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

    C语言#define的应用

    C/C++ 编程语言中,当程序被编译时,被发送到编译器,编译器将程序转换为机器语言,然后完成编译并执行该程序。预处理器也称为宏
    发表于 03-06 11:29 327次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>#define的应用

    C语言中的预处理

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

    介绍C语言中错误处理和异常处理的一些常用的方法和策略

    C语言是一种低级的、静态的、结构化的编程语言,它没有提供像C++或Java等高级语言中的异常处理
    的头像 发表于 02-28 14:25 563次阅读

    C语言中的头文件

    #include 指令会指示 C 预处理器浏览指定的文件作为输入。预处理器的输出包含了已经生成的输出,被引用文件生成的输出以及 #include
    发表于 02-23 14:06 389次阅读

    C语言-#和##的具体用法

    C语言中,在宏里面使用’#’和’##’有它非常神奇的作用。在宏定义的替换的过程中,#号可以作为一个预处理运算符,把宏参数转换为字符串。##运算符则可以把两个宏参数组合在一起。下面就来说说具体的用法。
    的头像 发表于 12-19 12:54 4562次阅读
    <b class='flag-5'>C</b><b class='flag-5'>语言</b>-#和##的具体用法

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

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

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

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

    为什么C语言要进行编译

    时主要分为了4个阶段,每个阶段的具体作用将在接下来进行介绍。 注:预处理中的cpp不是 c plus plus,而是c pre-process Part1预处理 命令:gcc -E h
    的头像 发表于 11-24 15:47 1182次阅读
    为什么<b class='flag-5'>C</b><b class='flag-5'>语言</b>要进行编译

    javascript的成熟分类

    JavaScript的成熟分类可以从多个角度进行划分,以下是几种常见的分类方式: 语言成熟度: 解释型语言:JavaScript是一种解释型语言
    的头像 发表于 11-16 10:30 31.5w次阅读

    请问C语言文件中的预处理操作符#和##各有什么作用?

    C语言文件中的预处理操作符#和##各有什么作用?
    发表于 11-06 08:09