首页
学习
活动
专区
工具
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语言库函数中查找 ""会先在本地目录查找,找不到再到库函数中去找,一次只能包含一个文件,在编译预处理时...条件编译 一般情况下,源程序中的所有语句都参加编译,但是我们有时会需要满足某种条件时才被编译

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

预处理指令(条件编译

条件编译的概念 •在很多情况下,我们希望程序的其中一部分代码只有在满足一定条件时才进行编译,否则不参与编译(只有参与编译的代码最终才能被执行),这就是条件编译。...#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

709110

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

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

84170

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

程序的编译预处理操作)+链接 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指令的地方一样。 这种替换方式很简单: 预处理器先删除这条指令,并用包含文件的内容替换。

51600

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

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

16420

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

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

1K40

预处理指令、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.1K10

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

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

28030

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

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

40430

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

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

39820

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

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

60030

从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,-

6410

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

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

11310

【Android APT】编译时技术 ( 开发编译时注解 )

文章目录 一、编译时注解 二、编译时注解 使用 三、注解的保留时间 四、博客资源 一、编译时注解 ---- 上一篇博客 【Android APT】编译时技术 ( 编译时注解 和 注解处理器 依赖库 )...中创建并配置了 annotation 编译时注解 依赖库 和 annotation-compiler 注解处理器 依赖库 ; 本博客开始进行开发 编译时注解 依赖库 ; 开发 annotation 编译时注解...右键点击包名 , 选择 " New / Java Class " 选项 , 在弹出的对话框中 , 选择 " Annotation " 注解对话框 , 然后输入注解名称 BindView , 注解源码开发...使用 ---- 注释掉之前的 ButterKnife 的 编译时注解 和 注解处理器 , 使用应用中自己开发编译时注解 和 注解处理器 ; build.gradle 构建脚本 依赖库相关配置 如下....class 字节码文件 , 该注解就消失了 , 如 @Override 仅在编译时查看父类是否有该方法 ; ② 编译时注解 : 注解保留到字节码阶段 ; ③ 运行时注解 : 注解保留到运行时 ; 源码期注解

21510

GO web 开发 实战三,数据库预处理

上一篇文章我们进行了数据操作,都是使用占位符的方式来操作的 咱们其实可以使用 mysql 预处理的方式来操作这些 那么我们一起来看看什么是已处理呢? 什么是预处理?...,我们大概知道预处理肯定比普通的 sql 执行快 那么预处理有啥好处?...优化 mysql 服务器重复执行 sql 的方法,可以提升服务器性能,提前让服务器编译,一次编译多次 执行,节省后续编译的成本 避免 sql 注入的问题 //预处理 插入数据操作 func prepareInfo..."commit success ") } sqlx使用 咱们还可以使用第三方库 sqlx 安装第三方库 sqlx ,go get github.com/jmoiron/sqlx 第三方库可以提交高开发效率...,简化开发操作 package main import ( "fmt" "github.com/jmoiron/sqlx" _ "github.com/go-sql-driver/mysql"

33040
领券