C语言中预编译/预处理的使用
C 预编译
- 1. 文件包含
- 2. 条件编译
- 2.1 #if #ifdef #endif等
- 2.2 #ifdef __cplusplus extern “C” { #endif
- 3. 布局控制
- 4. 宏替换
- 4.1 宏定义
- 4.2 宏函数
预处理的主要作用就是通过内建功能对一个资源进行等价替换,从而对源文件实现代码文本的替换工作,比如文本替换、文件包含、删除部分代码等,以减少重复运算过程,提高程序运行效率。最常见的预处理有:文件包含,条件编译、布局控制和宏替换4种。
1. 文件包含
#include 是一种最为常见的预处理,主要是做为文件的引用组合源程序正文。
文件包含有两种格式,分别是: #include “file” 和 #include< file >
这两格式的区别在于:
- 使用双引号,系统首先到当前目录下查找被包含的文件,如果没找到,再到系统指定的 " 包含文件目录 " (由用户在配置环境时设置)去找。
- 使用尖括号:直接到系统指定的 " 包含文件目录 " 去查找。
因此,通常使用双引号比较保险。
2. 条件编译
2.1 #if #ifdef #endif等
一般情况下,源程序中所有的代码都会参加编译,但是有时希望对其中一部分内容只在满足一定条件才进行编译,也就是对一部分内容指定编译的条件,这就是“条件编译”。
#if,#ifdef,#endif,#undef等也是比较常见条件编译的预处理,主要是进行编译时进行有选择的挑选,注释掉一些指定的代码,以达到版本控制、防止对文件重复包含的功能。
2.2 #ifdef __cplusplus extern “C” { #endif
在cpp文件中会出现如下片段:
#ifdef __cplusplus
extern “C” {#endif//代码#ifdef __cplusplus
}
#endif
它的作用在于:
对C++函数的重载处理。在C++中,为了支持重载机制,在编译生成的汇编码中,要对函数的名字进行一些处理,加入比如函数的返回类型等等。而在C中,只是简单的函数名字而已,不会加入其他的信息。也就是说:C++和C对产生的函数名字的处理是不一样的。
为了在C++中尽可能的支持C,extern “C” 就是其中的一个策略。为了在C++代码中调用C的库文件,就需要用extern “C” 来告诉编译器,用C的方式来链接它们。
使用过程中,会用到#ifdef __cplusplus #endif 对头文件进行定义声明,表示的意思是:如果这是一段cpp的代码,那么加入extern “C” {" 和 " }"处理其中的代码,其中{ }内部的代码是通过extern "C"进行处理,所以在所有的头文件引用中,如果是CPP代码文件,就会自动调用g++进行编译,但是如果是C代码文件,自动调用gcc进行编译。
3. 布局控制
#progma,主要功能是为编译程序提供非常规的控制流信息。
4. 宏替换
4.1 宏定义
#define 与 typedef 的作用域区别:主要体现在函数中定义,#define在函数中定义可以作用于整个文件的定义之后部分,而在函数中定义的 typedef 类型只作用于函数中定义以下的部分。
4.2 宏函数
宏函数不是真正的函数,而是带参数的宏,只是使用方法像函数而已。
在代码中使用宏函数,预处理时会经历两次替换,第一次把宏函数替换成它后面的一串代码、表达式,第二次把宏函数中的参数替换到表达式中。
什么样的代码适合封装成宏函数?
1、代码量少,即使多次使用也不会造成代码段过度冗余。
2、调用次数,但执行次数多。
3、对返回值没有要求。
宏函数的优缺点:
优: 1、执行速度快,它不是真正的函数调用,而是代码替换,不会经历传参、跳转、返回值。
2、不会检查参数的类型,因此通用性强。
缺: 1、由于它不是真正的函数调用,而是代码替换,每使用一次,就会替换出一份代码,会造成代码冗余、编译速度慢、可执行文件变大。
2、没有返回值,最多可以有个执行结果。
3、类型检查不严格,安全性低。
4、无法进行递归调用。
C语言中预编译/预处理的使用相关推荐
- c语言预编译编译,c语言中预编译
预编译又被称为预处理,是做代码文本的替换工作. 处理#开头的指令.就是为编译做预备工作的准备. 常见的预编译指令有三种 (1)#include指令 该指令指示编辑器将xxx.xxx文件的全部内容插入此 ...
- picf509c语言程序,樊媛媛c语言程序设计09编译预处理.pptx
樊媛媛c语言程序设计09编译预处理 9.1 宏定义 1.不带参的宏定义用一个指定的标识符(宏名)代表一个字符串.一般形式:#define 标识符 字符串如:#define PI 3.1415926有了 ...
- .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析
.NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 .NET1.1中预编译ASP.NET页面实现原理浅析[1]自动预编译机制浅析 作者:&;nbsp来自:网络 htt ...
- C语言中预定义符 __FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__ 的使用演示
本文演示了C语言中预定义符 __FILE__, __LINE__, __FUNCTION__, __DATE__, __TIME__ 的使用. 这几个预定义符的名称就没必要再介绍了,顾名思义嘛. // ...
- C++头文件中预编译宏的目的
C++头文件中预编译宏的目的 eg: #ifndef _FACTORY_H_ #define _FACTORY_H_ ...... #endif //~_FACTORY_H_ 防止头文件被重复包含,导 ...
- FPGA设计心得(8)Verilog中的编译预处理语句
文章目录 写在前面 正文 宏定义 文件包含 条件编译 条件生成语句问题 回顾 参考资料 交个朋友 写在前面 相关博文 博客首页 注:学习交流使用! 正文 看稍微复杂一点的IP Core以及模块等 ,都 ...
- 脚本没有类似C语言的预编译,开源脚本库
开源脚本库 1 TinyC(TCC) 1.1 优点 1.1.1 速度快:直接x86汇编代码 1.1.2 标准C支持:支持标准的 ANSI C 语言,而且也支持 ISO C99 标准 1.2 缺点 1. ...
- c语言函数与编译预处理教学视频,C语言课程第6章 函数及编译预处理.ppt
C语言课程第6章 函数及编译预处理 6.1模块化程序设计与函数 在设计较复杂的程序时,我们一般采用的方法是:把问题分成几个部分,每部分又可分成更细的若干小部分,逐步细化,直至分解成很容易求解的小问题. ...
- C语言条件编译及编译预处理阶段
一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...
最新文章
- YML(2)yml 语法
- 蚂蚁金服 CTO 程立登台新加坡 Money 20/20 Asia,传递技术让世界更平等的愿景
- ERD2005中文版
- java clone方法_干货满满:Java中创建对象的五种方式详解
- MRCTF2020]你传你码呢
- PHP socket初探 --- 一些零碎细节的拾漏补缺
- 输入框值不能赋值成功
- 计算机网络---计算机网络分层结构
- android基础入门控件详解(4)
- JSP — 如何设置jsp中cookie的过期时间
- Spring Boot 使用Dubbo 创建Hello Wrold
- Matlab 求全要素生产率,如何用DEAP进行全要素生产率分析
- 游戏编程入门步骤,想不到吧.
- 华北科技计算机组成原理,华北科技学院—《计算机组成原理》设计性实验报告.doc...
- 思普linux安装教程,思普产品全生命周期管理系统_全生命周期管理_云市场-华为云...
- mysql如何设置host_如何快速修改MySQL用户的host属性
- Excel 2010 SQL应用066 返回数字与文本混杂的数据
- Matlab simulink中找不到s函数
- ubuntu开启远程桌面功能
- 2019上交CS考研经验贴
热门文章
- python模拟足球比赛_如何使用python从livescores获取足球比赛结果
- mysql没有表空间,MySQL的表空间是什么
- List、set、Map的底层实现原理
- 一文帮你分析外贸收款难问题
- 基于ESP32的开源定时浇花系统
- 儿童python编程app_Python编程狮app下载
- Windows企业版2019安装,和显示无法打开所需文件d:\sources\install.wim.”解决办法
- DSHOT600电调协议Verilog
- 2016暑假集训小结
- SSIS - 1.简介