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

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

3天内不再提示

C预处理器只不过是一个文本替换工具而已

电子工程师 来源:未知 作者:李倩 2018-11-08 14:41 次阅读

C 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤。简言之,C预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理。我们将把 C 预处理器(C Preprocessor)简写为 CPP。

所有的预处理器命令都是以井号(#)开头。它必须是第一个非空字符,为了增强可读性,预处理器指令应从第一列开始。下面列出了所有重要的预处理器指令:

预处理器实例

分析下面的实例来理解不同的指令。

#define MAX_ARRAY_LENGTH 20

这个指令告诉 CPP 把所有的 MAX_ARRAY_LENGTH 替换为 20。使用#define定义常量来增强可读性。

#include#include"myheader.h"

这些指令告诉 CPP 从系统库中获取 stdio.h,并添加文本到当前的源文件中。下一行告诉 CPP 从本地目录中获取myheader.h,并添加内容到当前的源文件中。

#undef FILE_SIZE#define FILE_SIZE 42

这个指令告诉 CPP 取消已定义的 FILE_SIZE,并定义它为 42。

#ifndef MESSAGE #define MESSAGE "You wish!"#endif

这个指令告诉 CPP 只有当 MESSAGE 未定义时,才定义 MESSAGE。

#ifdef DEBUG /* Your debugging statements here */#endif

这个指令告诉 CPP 如果定义了 DEBUG,则执行处理语句。在编译时,如果您向 gcc 编译器传递了-DDEBUG开关量,这个指令就非常有用。它定义了 DEBUG,您可以在编译期间随时开启或关闭调试。

预定义宏

ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。

让我们来尝试下面的实例:

当上面的代码(在文件test.c中)被编译和执行时,它会产生下列结果:

预处理器运算符

C 预处理器提供了下列的运算符来帮助您创建宏:

宏延续运算符(\)

一个宏通常写在一个单行上。但是如果宏太长,一个单行容纳不下,则使用宏延续运算符(\)。例如:

#define message_for(a, b) \ printf(#a " and "#b ": We love you!\n")

字符串常量化运算符(#)

在宏定义中,当需要把一个宏的参数转换为字符串常量时,则使用字符串常量化运算符(#)。在宏中使用的该运算符有一个特定的参数或参数列表。例如:

当上面的代码被编译和执行时,它会产生下列结果:

CaroleandDebra:We love you!

标记粘贴运算符(##)

宏定义内的标记粘贴运算符(##)会合并两个参数。它允许在宏定义中两个独立的标记被合并为一个标记。例如:

当上面的代码被编译和执行时,它会产生下列结果:

token34 =40

这是怎么发生的,因为这个实例会从编译器产生下列的实际输出:

printf ("token34 = %d", token34);

这个实例演示了 token##n 会连接到 token34 中,在这里,我们使用了字符串常量化运算符(#)和标记粘贴运算符(##)。

defined() 运算符

预处理器defined运算符是用在常量表达式中的,用来确定一个标识符是否已经使用 #define 定义过。如果指定的标识符已定义,则值为真(非零)。如果指定的标识符未定义,则值为假(零)。下面的实例演示了 defined() 运算符的用法:

当上面的代码被编译和执行时,它会产生下列结果:

Hereis the message:You wish!

参数化的宏

CPP 一个强大的功能是可以使用参数化的宏来模拟函数。例如,下面的代码是计算一个数的平方:

int square(int x){ return x * x;}

我们可以使用宏重写上面的代码,如下:

#define square(x)((x)*(x))

在使用带有参数的宏之前,必须使用#define指令定义。参数列表是括在圆括号内,且必须紧跟在宏名称的后边。宏名称和左圆括号之间不允许有空格。例如:

#include#define MAX(x,y)((x)>(y)?(x):(y))int main(void){ printf("Max between 20 and 10 is %d\n", MAX(10,20)); return0;}

当上面的代码被编译和执行时,它会产生下列结果:

Max between 20and10is20

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

    关注

    1

    文章

    1569

    浏览量

    48598
  • 预处理器
    +关注

    关注

    0

    文章

    13

    浏览量

    2178

原文标题:C语言中的预处理器

文章出处:【微信号:c-stm32,微信公众号:STM32嵌入式开发】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    澜启第6套字典算法替换工具

    中九澜启方案第6套字典算法替换工具(2011-9-22更新)请在替换前面打钩,然后将澜起文件拖入就OK了,文件保存在同文件夹中
    发表于 09-23 13:24

    编程是种思维方式,而代码是种表现形式,硬件只不过是对思维方式的物理体现

    编程是种思维方式,而代码是种表现形式,硬件只不过是对思维方式的物理体现关于这句话,你怎么看?
    发表于 08-25 13:18

    C语言之预处理

    编译预处理器C语言编译重要组成部分。很好的利用C语言的
    发表于 06-03 17:23

    挺实用的进制转换工具

    挺实用的进制转换工具
    发表于 08-03 16:17

    预处理器在Build Settings中定义错误

    这个问题用PSoC Creator 3.3(3.3.0.410)进行。你好社区我问你关于问题的帮助(Bug?)在PSoC Creator。我想要的是:在编译环境中定义带有
    发表于 02-22 06:25

    E2411C和E5344A Intel ***预处理器接口

    E2411C和E5344A Intel ***预处理器接口
    发表于 03-05 10:40

    E2434系列Intel 80C186和80C188系列预处理器接口

    E2434系列Intel 80C186和80C188系列预处理器接口
    发表于 03-11 17:37

    E2413C Motorola ***预处理器接口

    E2413C Motorola ***预处理器接口
    发表于 03-14 20:20

    Post综合后的利用率只不过是实施后的利用率?

    嗨,Post综合后的利用率只不过是实施后的利用率......?谢谢娜文G K.
    发表于 05-12 08:57

    c语言预处理命令以什么开头

    c语言预处理命令以什么开头,目前我并没有windows软件编写经验,对C语言的应用也仅限于各种单片机的编程,所以对预处理的理解也只限于单片机程序上。
    发表于 07-20 07:00

    预处理器与死循环简述

    想成为嵌入式程序员应知道的0x10基本问题(面试必备)文章目录想成为嵌入式程序员应知道的0x10基本问题(面试必备)简述:预处理器(Preprocessor)死循环(Infinite loops
    发表于 12-21 07:56

    嵌入式C预处理器的基本概念和常用指令

    在嵌入式系统开发中,C预处理器是非常重要的一部分,可以在编译之前对源代码进行宏替换、条件编译和包含等处理。在本文中,我们将介绍嵌入式C预处理器的基本概念和常用指令。
    的头像 发表于 04-13 16:11 664次阅读

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

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

    C语言中的预处理器

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

    C预处理器及其工作原理

    C预处理器(C Pre-Processor)也常简写为 CPP,是一个与 C 编译器独立的小程序,预编译器并不理解 C 语言语法,它仅是在程序源文件被编译之前,实现文本替换的功能。
    的头像 发表于 03-12 14:14 195次阅读
    C<b class='flag-5'>预处理器</b>及其工作原理