首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

编译预处理

编译预处理是对C语言源程序编译前进行的预加工,这些操作是通过命令来实现的,即预编译命令,主要有三种,即宏定义、文件包含和条件编译。...这些规定是由编译系统规定的,由于不是C语言本身的组成部分,因此不能直接编译,而要经过编译预处理再与源程序进行编译 书写规则:#+关键字(一行书写一个) 宏定义 用一个指定的标识符(名字)来代表一个字符串...,对于非形参字符*保留 带参数的宏定义中也可以引用已定义的宏定义 #define PI 3.1415926 #define S(r) PI*r*r #define V(r) 4.0/3*S(r)*r 预处理是对每个宏名进行展开替换...,再进行新的定义 文件包含 格式:#include 或 \#include "文件名" 会先在C语言库函数中查找 ""会先在本地目录查找,找不到再到库函数中去找,一次只能包含一个文件,在编译预处理时...条件编译 一般情况下,源程序中的所有语句都参加编译,但是我们有时会需要满足某种条件时才被编译

18910
  • 您找到你想要的搜索结果了吗?
    是的
    没有找到

    预处理指令(条件编译

    条件编译的概念 •在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。...#endif •1>如果条件1成立,那么编译器就会把#if 与 #elif之间的code1代码编译进去(注意:是编译进去,不是执行,很平时用的if-else是不一样的)2> 如果条件1不成立、条件2成立...,那么编译器就会把#elif 与 #else之间的code2代码编译进去 •3> 如果条件1、2都不成立,那么编译器就会把#else 与 #endif之间的code3编译进去 •4> 注意,条件编译结束后...printf("MAX大于0"); 11 #else 12     printf("MAX小于0"); 13 #endif 14     return 0; 15 } •在第3行定义了一个宏MAX,当然在开发中这个...由于MAX为11,所以#elif的条件成立,第10行代码将会被编译进去,其实编译预处理后的代码是这样的: int main () 4 { 5     printf("MAX大于0"); 6     return

    763110

    预处理--》编译--》运行的区别

    其实加了关键字const只是提示编译器这个变量是常量,如果我们在接下来的操作中试图更改它,编译器会报错,而并不是真正的常量,上面的例子也说明通过指针也是可以更改的,什么情况下完全不能修改呢,当A是加const...下面看预处理: 看看编译会提示什么: 很明显就是因为宏定义了rectanger,如果有重名的话,宏定义覆盖所有其它标识符,因为它在预处理阶段而不是 编译阶段处理,所以在函数里面重新定义rectanger...我们可以使用 gcc -E来查看预处理后而编译前的东西,一看这么多页屏幕都看不完整加个less查看,居然有好几屏幕,只截取最后面的一部分来看: 是不是发现了啊,预处理的时候已经把rectanger...反正处理的步骤就是 预处理 --》 编译 --》 运行,但步骤的不同是涉及到很多东西的,比如全局变量和局部变量的赋值,为什么全局变量只能用常量来初始化而局部变量可以用带数学函数的表达式来初始化呢?...如double pi = acos(-1.0); 因为程序开始运行时要用适当的值来初始化全局变量,所以初始值必须保存在编译生成的可执行文件中,因此初始值在编译时就要计算出来,然而上面那种Initializer

    88470

    【程序的编译(预处理操作)+链接】

    程序的编译预处理操作)+链接 1. 程序的翻译环境和执行环境 2. 详解编译+链接 2.1 翻译环境&&编译本身分成的几个阶段 2.2 运行环境 3....通过上述流程我们得到以下几个关键的编译步骤,即: 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生的结果都放在test.i文件中。...预处理详解 3.1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间...#endif //__DEBUG__ } return 0; } 即当把宏注释掉,条件为假时,这条语句不参与编译,在预处理时已经消除了。 常见的编译指令有: 1....3.5 文件包含 我们已经知道,#include指令可以使另外一个文件被编译。就像它实际出现于#include指令的地方一样。 这种替换方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。

    54900

    【C语言】程序的编译预处理

    而源程序通过编译和链接最终形成可执行程序,但是编译本身也分为几个阶段:预编译/预处理——编译——汇编 预处理 选项 gcc -E test.c -o test.i 预处理完成之后就停下来,预处理之后产生的结果都放在...---- 二、预处理 1.预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC...#endif //常量表达式由预处理器求值。 如: #define __DEBUG__ 1 #if __DEBUG__ //.. #endif 2.多个分支的条件编译 #if 常量表达式 //......这种替换的方式很简单:预处理器先删除这条指令,并用包含文件的内容替换。...至于其他预处理指令,如果大家对其感兴趣的化可以查找查找资料看一看。

    26520

    预处理指令、typedef、条件编译、多文件代码

    预处理指令 源代码中,以井号#开头的并不是C语言中的语句。它们属于预处理指令。 在代码被编译前,预处理器会先处理预处理指令,并根据预处理指令的意义修改C语言源码。...修改后的代码将另存为中间文件或直接输入到编译器。并不会保存到源文件中。所以,预处理器不会改动源文件。...预处理指令#include 预处理指令#include,会将文件stdio.h中的代码复制到该预处理指令出现处,并删除该预处理指令。 修改后的代码将另存为中间文件或直接输入到编译器。...区别 预处理中的#if: 预处理指令将在编译前,由预处理器处理。预处理器根据预处理指令的意图,修改代码。类似于#define指令,替换代码中出现的宏。...多文件代码 预处理:执行预处理指令,修改源代码。 编译:将预处理后的源代码转换为二进制目标文件。 链接:将需要用到的目标文件合并成可执行文件。

    1.1K40

    【C语言】预处理&&编译链接&&调试技巧详解

    1.预处理 1.1 预定义符号 __FILE__ //进行编译的源文件 __LINE__ //文件当前的行号 __DATE__ //文件被编译的日期...这里我们得知道预处理之后的结果是什么: 这段代码是证明执行的呢?...#endif //常量表达式由预处理器求值 如: #define __DEBUG__ 1 #if __DEBUG__ //.....,就像它实际出现于 #include 指令的地方一样 这种替换的方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换 这样一个源文件被包含10次,那就实际被编译10次 1.6.1 头文件被包含的方式...预编译的过程: 注释的替换(删除) 注释被替换成一个空格 头文件的包含 #include #define 符号的替换 所有的预处理指令都是在预编译阶段处理的 (文本操作) 2.3.1.2 编译

    27510

    预处理指令、typedef、条件编译、多文件代码

    预处理指令 源代码中,以井号#开头的并不是C语言中的语句。它们属于预处理指令。 在代码被编译前,预处理器会先处理预处理指令,并根据预处理指令的意义修改C语言源码。...修改后的代码将另存为中间文件或直接输入到编译器。并不会保存到源文件中。所以,预处理器不会改动源文件。...图片 预处理指令#include 预处理指令#include,会将文件stdio.h中的代码复制到该预处理指令出现处,并删除该预处理指令。 修改后的代码将另存为中间文件或直接输入到编译器。...区别 预处理中的#if: 预处理指令将在编译前,由预处理器处理。预处理器根据预处理指令的意图,修改代码。类似于#define指令,替换代码中出现的宏。...图片 多文件代码 预处理:执行预处理指令,修改源代码。 编译:将预处理后的源代码转换为二进制目标文件。 链接:将需要用到的目标文件合并成可执行文件。

    1.2K00

    【C 语言】编译过程 分析 ( 预处理 | 编译 | 汇编 | 链接 | 宏定义 | 条件编译 | 编译器指示字 )

    【嵌入式开发】C语言 指针数组 多维数组 2.【嵌入式开发】C语言 命令行参数 函数指针 gdb调试 3.【嵌入式开发】C语言 结构体相关 的 函数 指针 数组 4....【嵌入式开发】gcc 学习笔记(一) - 编译C程序 及 编译过程 5....编译过程 1. 编译过程图解 ---- 编译过程 : 编译过程 : 预处理 -> 编译 -> 汇编 -> 链接; 1. 编译预处理 : 产生 .i 后缀的预处理文件; 2...., 可以条件编译来维护一套代码, 编译出不同的产品 ; 4.开发板和正式版区分 : 使用条件编译可以区分产品的开发调试版本 和 正式发布版本 ; ---- (2) 条件编译 示例 (简单的条件编译...条件编译控制示例 ( 编译不同产品 | 控制开发版本和发布版本编译) ---- 条件编译控制代码示例 : 1.代码 : #include //控制开发版本与发布版本 : //

    1.2K10

    函数(七)(内外部函数与编译预处理

    例如:extern void process(int a,int b); 编译预处理 C语言的编译预处理命令主要包括:宏定义、文件包含和条件编译。...预处理命令均以“#”开始,命令的结尾没有分号,每条预处理命令必须占用单独一行。...1.宏定义 (1) 无参宏定义 无参宏定义的一般形式如下: #define 宏名 字符序列 如果源程序中使用了宏定义,编译预处理过程中,自动把源程序中出现的所有“宏名”替换为“字符序列”,这是一个纯文本替换...(3) 文件包含 文件包含也是一种编译预处理命令,其作用是把被包含的文件的内容全部引入到使用文件包含命令的源程序文件中。...如果源程序需要根据特定的条件决定一部分源代码是否参加编译,则需要使用条件编译预处理命令。 C语言的条件编译预处理指令主要有三种形式。

    30830

    【初学者入门C语言】之编译预处理(十)

    #include 两种格式 #include #include"头文件名称" 头文件包含的顺序 宏定义 宏 嵌套宏 举例  有参数的宏定义 格式 举例 易错点 总结 ---- 前言 预编译伪指令一般都以...#打头,且前面不能有其他字符,只能出现空白字符,执行过程是C的编译处理器对预编译伪指令进行处理后生成中间文件作为编译器的输入,因此所有的预编译伪指令都不会进入编译阶段。...文件包含 #include #include伪指令用于包含一个头文件,头文件中存放的一般是模块接口,编译预处理器在扫描到伪指令后就用对应的文本内容替换它。...两种格式 #include 一般用于包含的是库头文件,指示编译预处理器在开发环境设定的搜素路径中查找所需要的头文件 #include"头文件名称" 一般用来包含自己编写的头文件。

    43330

    【C语言篇】编译和链接以及预处理介绍(上篇)

    其实翻译环境是由编译和链接两个⼤的过程组成的,⽽编译⼜可以分解成:预处理(也叫预编译)、编译、汇编三个过程。...链接库是指运⾏时库(它是⽀持程序运⾏的基本函数集合)或者第三⽅库 如果再把编译器展开成3个过程,那就变成了下⾯的过程: 编译过程以Linux环境下的gcc为编译器演示 预处理(预编译) 在预处理阶段...在 gcc 环境下想观察⼀下,对 test.c ⽂件预处理后的.i⽂件,命令如下: gcc -E test.c -o test.i 预处理阶段主要处理那些源⽂件中#开始的预编译指令。...预处理(预编译)详解 在上面的翻译环境简单介绍了预处理的一些操作,在接下来将会比较详细的讲解一下: 预定义符号 __FILE__ //进⾏编译的源⽂件 __LINE__ //⽂件当前的⾏号 __DATE...综上我们来对比一下: 写在最后 关于编译链接具体过程十分复杂,本篇只是笼统地介绍了一下,在下一篇博客中将会把预处理阶段其它的知识进行比较详细的介绍,敬请期待喔 以上就是编译和链接以及预处理介绍(上篇

    11410

    【C语言篇】编译和链接以及预处理介绍(下篇)

    前言 本篇接前一篇【C语言篇】编译和链接以及预处理介绍(上篇) #和## #运算符 #运算符将宏的⼀个参数转换为字符串字⾯量。它仅允许出现在带参数的宏的替换列表中。...这种替换的⽅式很简单:预处理器先删除这条指令,并⽤包含⽂件的内容替换。 ⼀个头⽂件被包含10次,那就实际被编译10次,如果重复包含,对编译的压⼒就⽐较⼤。...,最上面都是有这一句的,这是一种比较现代的写法,很多编译器都使用这种来防止头文件的重复包含 其他预处理指令 #error #pragma #line ......#pragma pack()在结构体部分介绍了 下图出自C语言深度解剖 写在最后 在这两篇我们笼统的介绍了关于编译了链接的过程,并对编译阶段的预处理过程进行了比较深入的讲解,希望对各位读者有所帮助...以上就是编译和链接以及预处理介绍(下篇)内容啦,各位大佬有什么问题欢迎在评论区指正,您的支持是我创作的最大动力!

    9110

    C语言进阶(十五) - 预处理与程序编译初步解析

    前言 本节主要介绍程序运行前的预处理(预编译)阶段的相关知识。同时简单介绍一个程序是如何从一行行代码到开始运行并得到结果的。 ---- 1....预处理 1.1 预定义符号 首先是C语言内置的预定义符号。...宏的替换在预处理阶段完成,无法进行调试(程序运行时)。 宏是类型无关的,这意味着宏不够严谨。(双刃剑)。 宏可能会带来运算符优先级的问题,导致程序出现错误。...替换方式:预处理器先删除这条指令,并用包含文件的内容替换。 那么如果一个源文件被包含多次,那么实际就被编译多次。...---- 结语 本节主要介绍了预处理阶段涉及的概念,了解更深层次的程序的编译与链接知识可以说是在修炼我们的内功,仅有本文还远远不够。 ---- END

    43320

    预处理编译和汇编这些步骤程序发生的变化

    现在大多数的程序都是在IDE上进行开发的,预处理编译、汇编和链接这些过程都有编译器已经设定完成,而实际程序在这个过程发生了什么,我们就无从得知了。...参考《程序员的自我修养》 预处理 1.将所有的#define删除,宏定义进行替换。 2.处理所有条件预编译指令,比如#ifndef ,#define,#if,#elif等。...5.保留#program 编译器指令。 6.展开头文件 下面验证上述提到的预处理阶段做的事情。...我们重点关注一下,宏定义是否被替换、注释是否被删除、以及条件编译指令是否被删除。 对照我们上边写出程序,可以看出。...宏定义被替换、单行注释和多行注释均被删除、条件编译指令被删除、添加了行号和文件名。

    66030

    从Linux角度具体理解程序翻译过程-----预处理编译、汇编、链接

    前言: 在C语言中,我们知道程序从我们所写的代码到可执行执行的过程中经历了以下过程 1.预处理 2.编译 3.汇编 4.链接  可以通过下图来理解 翻译过程 1.预处理 该过程主要进行以下操作:...,其实codetest.i中前800多行都是包含了stdio.h文件里的内容,这也就是我们所说的预处理第一个步骤:头文件的包含  图二: 可以发现注释部分在codetest.i中消失了; 条件编译中,因为...接下来,我们在Linux的命令行中输入: gcc -S codetest.i -o codetest.s //代码文件名(写成codetest.c也行,只是要再次预处理编译后的文件名 其中:...-S:表示编译 codetest.i:我们的代码所属文件(写成codetest.c也行,只是要再次预处理) -o:理解为起别名 codetest.s:生成的编译后的文件名 再次输入:ls,就会发现多了个.../codetest  执行codetest.c代码,输出以下部分 以上就是通过Linux查看C语言翻译环境的所有过程啦~~(预处理编译,汇编,链接) 以下是识记小部分,  * 你是不是被什么-E,-

    10910

    【C】程序的编译链接预处理详解(C语言内功,精炼,基础)

    前言:大家好,这里是YY;此篇博客主要是程序的编译/链接/预处理详解的知识点;包含【程序的翻译环境和执行环境】【编译和链接的过程】【编译的几个阶段】【运行环境】【预定义符号】【define/undef...】【#define替换规则】【#和##的应用】【带副作用(功能)的宏参数】【宏与函数的对比】【条件编译(预处理指令)】【文件包含过程】【解决嵌套头文件包含问题方法】 PS:创作不易,每个知识点都有例题或者图帮助理解...一.程序的翻译环境和执行环境 在ANSI C的任何一种实现中,存在两个不同的环境 翻译环境,此过程中源代码转换为可执行的机器指令 执行环境,它用于实际执行代码 二.编译和链接的过程 三.编译的几个阶段...__DATE__ //文件被编译的日期 __TIME__ //文件被编译的时间 __STDC__ //如果编译器遵循ANSI C,其值为1,否则未定义 六.define/undef...(预处理指令) 例如: 1.预处理指令和普通判断语句的区别: 预处理指令在预处理阶段就将不要的代码删除 后面都要跟一个endif收尾 2.常见的条件编译指令: 普通条件编译:if/endif

    16710
    领券