C语言进阶——编译预处理指令
编译预处理指令
• #开头的是编译预处理指令
• 它们不是C语⾔的成分,但是C语⾔程序离不开它们
• #define⽤来定义⼀个宏
#define
• #define <名字> <值>
• 注意没有结尾的分号,因为不是C的语句
• 名字必须是⼀个单词,值可以是各种东⻄
• 在C语⾔的编译器开始编译之前,编译预处理程序(cpp)会把程序中的名字替换成值
• 完全的⽂本替换
• gcc —save-temps
宏
• 如果⼀个宏的值中有其他的宏的名字,也是会被
替换的
• 如果⼀个宏的值超过⼀⾏,最后⼀⾏之前的⾏末
需要加\
• 宏的值后⾯出现的注释不会被当作宏的值的⼀部
分
没有值的宏
• #define _DEBUG
• 这类宏是⽤于条件编译的,后⾯有其他的编译预处理指令来检查这个宏是否已经被定义过了
预定义的宏
• __LINE__
• __FILE__
• __DATE__
• __TIME__
• __STDC__
错误定义的宏
• #define RADTODEG(x) (x * 57.29578)
• #define RADTODEG(x) (x) * 57.29578
带参数的宏的原则
• ⼀切都要括号
• 整个值要括号
• 参数出现的每个地⽅都要括号
• #define RADTODEG(x) ((x) * 57.29578)
• #define cube(x) ((x)*(x)*(x))
• 宏可以带参数
带参数的宏
• 可以带多个参数
• #define MIN(a,b) ((a)>(b)?(b):(a))
• 也可以组合(嵌套)使⽤其他宏
// 比如++i类似的自增运算符 属于是文本替换 所以在传参的时候,并没有执行一次自增运算。它只是像函数而且带参数的宏。
分号?
#define PRETTY_PRINT(msg) printf(msg); //不要加分号,因为你在C代码中会习惯再加上一个分号的。
if (n < 10)
PRETTY_PRINT("n is less than 10");
else
PRETTY_PRINT("n is at least 10");
带参数的宏
• 在⼤型程序的代码中使⽤⾮常普遍
• 可以⾮常复杂,如“产⽣”函数
• 在#和##这两个运算符的帮助下
• 存在中⻄⽅⽂化差异
• 部分宏会被inline函数替代
其他编译预处理指令
• 条件编译
• error
C语言进阶——编译预处理指令的更多相关文章
- C语言简单编译预处理-笔记
预处理指令 所谓预处理,是指,在编译之前对程序源码进行初步的转换,产生新的源代码提供给编译器.预处理时主要完成:包含其他源文件,定义宏,根据条件决定编译时是否包含某些代码(>防止重复包含某些文件 ...
- C语言系列之预处理指令、循环左移函数的使用(四)
本章节将讲两个知识点 第一个知识点:常用的预处理指令 第二个知识点:循环左移右移函数 第一个知识点:预处理指令 一种预处理指令是#define,他把名字A定义为P0,当这个名字出现在源文件的任何地方时 ...
- 【C语言】15-预处理指令1-宏定义
预处理指令简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 2 ...
- [C语言]进阶|程序结构
------------------------------------------------------------------------------------ 全局变量: // main.c ...
- c语言编译预处理和条件编译执行过程的理解
在C语言的程序中可包括各种以符号#开头的编译指令,这些指令称为预处理命令.预处理命令属于C语言编译器,而不是C语言的组成部分.通过预处理命令可扩展C语言程序设计的环境. 一.预处理的工作方式 1.1. ...
- c语言学习之基础知识点介绍(九):预处理指令和多文件开发
一:预处理指令 /* 预处理指令: 作用:在程序编译之前做一些操作. 预处理命令写法的共同特点:都是以#号开头. 文件包含指令:#include 是一个文件包含命令. 作用:把某个文件内的内容读取出来 ...
- C语言预处理指令的初步了解
所谓预处理是指在进行编译的第一遍扫描(词法扫描和语法分析)之前所作的工作.预处理是C语言的一个重要功能,它由预处理程序负责完成.当对一个源文件进行编译时,系统将自动引用预处理程序对源程序中的预处理部分 ...
- c语言的预处理指令分3种 1> 宏定义 2> 条件编译 3> 文件包含
宏简介 1.C语言在对源程序进行编译之前,会先对一些特殊的预处理指令作解释(比如之前使用的#include文件包含指令),产生一个新的源程序(这个过程称为编译预处理),之后再进行通常的编译 所有的预处 ...
- C语言条件编译及编译预处理阶段(转)
一.C语言由源代码生成的各阶段如下: C源程序->编译预处理->编译->优化程序->汇编程序->链接程序->可执行文件 其中 编译预处理阶段,读取c源程序,对其中的 ...
随机推荐
- 【codeforces 749A】Bachgold Problem
time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard ou ...
- Postman:非专业的并发测试
Postman是开发中常用的接口测试工具,也可以用来进行并发测试. 使用方法如下: 1. 直接输入url 选择GET方法,点击Send. 结果打印一个"test",如下: 2. 使 ...
- MockMvc control层单元测试 参数传递问题
GET: 1.路径参数@PathVariable 2.表单参数@RequestParam POST: 1.JSON请求体参数 @RequestBody 放: 1.路径参数@PathVariable 2 ...
- js 中日期2013-08-30或2019-08-24 12:30:00 转换成时间戳,和2019-08-29T02:15:08.000+0000转化为2019-08-29T02:15:08
js 中日期2019-08-24 或2019-08-24 12:30:00 转换成时间戳 首先将它转成date日期类型,然后获取毫秒形式时间戳 let date=new Date("2019 ...
- new Date(2019-08-24 12:30:00)和new Date(2019-08-29T02:15:08.000+0000)在ios的兼容NAN问题
new Date()在安卓和pc端上正常显示,但是却在ios上显示 NAN的问题 正常写法: var time = new Date("2019-08-24 12:30:00"); ...
- 027.MFC_映射消息
映射消息MFC中的消息映射宏 DECLARE_MESSAGE_MAP BEGIN_MEASSAGE_MAP END_MESSAGE_MAP向导自动映射消息手动添加映射消息 MFC会帮我们自动映射大部分 ...
- Scala的正则表达式
想使用scala的正则表达式,需要首先导入 import scala.util.matching.Regex 然后就可以使用了,实例如下: val pattern = new Regex(" ...
- ELK学习实验010:Logstash简介
Logstash是具有实时流水线功能的开源数据收集引擎.Logstash可以动态统一来自不同来源的数据,并将数据规范化为您选择的目标.清除所有数据并使其民主化,以用于各种高级下游分析和可视化用例. 虽 ...
- ECShop二次开发指南(一)
ECSHOP是一套完整的网络商店解决方案,包括前台的商品展示.购物流程和强大易用的后台管理.由于 ecshop简单易用,使用者几乎可以在3几分钟简单的设置一下就可以拥有一个网上商店系统,所以很多的B2 ...
- linux技巧---创建应用快捷方式
linux中启动或关闭应用有时候比较麻烦,你必须cd到该应用的可执行脚本的目录中再执行该脚本,不能在任意目录下开启或关闭应用..当然,设置了环境变量path可以解决在任意目录下开启应用的问题,但是每个 ...