预处理器&预处理变量&头文件保护&条件编译
【常见的预处理功能】
- #include
- 头文件保护符
- 条件编译
【预处理器】
编译之前执行的一段程序,可以部分地改变我们所写的程序
举个例子:当预处理器看到#include标记时就会用指定的头文件的内容代替#include
【预处理变量】
不属于命名空间std,由预处理器负责管理
预处理变量有两种状态:已定义和未定义
当用到一个预处理变量时,预处理器会自动地将它替换为实际值。
【头文件保护符】
使用预处理变量以防止头文件被某个文件重复包含。
4个指令:#define、#ifdef、#ifndef、#endif
- #define:把一个名字设定为预处理变量
- #ifdef及#ifndef:检查某个指定的预处理变量是否已经定义
- #ifdef:当且仅当变量已定义时为真
- #ifndef:当且仅当变量未定义时为真
- 一旦结果检查为真,则执行后续操作直至遇到#endif指令为止。
注:预处理变量无视C++关于作用域的规则。
【条件编译】
当不希望对源程序所有内容都进行编译时,我们可以使用“条件编译”。
预处理程序提供了条件编译的功能,条件编译有三种形式:#ifdef 、#ifndef 、#if
1. #ifdef形式的条件编译
#ifdef 标识符
程序段1
#else
程序段2
#endif
注:如果标识符已被#define定义过,则对程序段1进行编译,而不编译程序段2,直到遇到#endif
2. #ifndef形式的条件编译
#ifndef 标识符
程序段1
#else
程序段2
#endif
注:与#ifdef相反,即标识符没有被#define定义过,才编译程序段1。
3. #if形式的条件编译
#if 常量表达式
程序段1
#else
程序段2
#endif
注:如果常量表达式的值为真(非0),则对程序段1进行编译,否则对程序段2进行编译
预处理器&预处理变量&头文件保护&条件编译的更多相关文章
- 第 16 章 C 预处理器和 C 库(条件编译)
/*-------------------------------------- names_st.h -- names_st 结构的头文件 ----------------------------- ...
- 【转载】GCC 预处理器选项
预处理器选项(Preprocessor Option) 下列选项针对C预处理器,预处理器用在正式编译以前,对C 源文件进行某种处理. 如果指定了`-E'选项, GCC只进行预处理工作.下面的某些选项必 ...
- 160907、CSS 预处理器-Less
CSS 预处理器是什么?一般来说,它们基于 CSS 扩展了一套属于自己的 DSL,来解决我们书写 CSS 时难以解决的问题: 语法不够强大,比如无法嵌套书写导致模块化开发中需要书写很多重复的选择器: ...
- C预编译, 预处理, C/C++头文件, 编译控制,
在所有的预处理指令中,#Pragma 指令可能是最复杂的了,它的作用是设定编译器的状态或者是指示编译器完成一些特定的动作.#pragma指令对每个编译器给出了一个方法,在保持与C和C++语言完全兼容的 ...
- C学习笔记(9)--- 预处理器,头文件
1.预处理器: 预处理器不是编译器的组成部分,但是它是编译过程中一个单独的步骤.简言之,C 预处理器只不过是一个文本替换工具而已,它们会指示编译器在实际编译之前完成所需的预处理. 我们将把 C 预处理 ...
- C和指针 第十四章 预处理器 头文件
编写一个C程序,第一个步骤称为预处理,预处理在代码编译之前,进行一些文本性质的操作,删除注释.插入被include的文件.定义替换由#define定义的符号,以及确定代码的部分内容是否应该按照条件编译 ...
- C#变量、常量、枚举、预处理器指令知多少
一.变量 C#共有其中变量类型有:静态变量.实类变量.数组元素.数值参数.引用参数.输出参数和局部变量 先定义一个简单的类来说明,如下: public class VariableDefine { p ...
- C语言基本语法——预处理器和预处理指令
1.什么是预处理器 2.什么是预处理器指令 3.预处理器指令 4.宏指令 5.宏函数 6.宏函数的优缺点 7.条件编译指令 1.什么是预处理器 • 预处理器是一个程序,用来处理源程序中的预处理指令. ...
- Docs-.NET-C#-指南-语言参考-预处理器指令:#if 预处理指令
ylbtech-Docs-.NET-C#-指南-语言参考-预处理器指令:#if 预处理指令 1.返回顶部 1. #if(C# 参考) 2018/06/30 如果 C# 编译器遇到 #if 指令,最终是 ...
随机推荐
- linux网络相关配制及命令
1.虚拟机配制 查看ip: ip addr 配制网卡(读者可以忽略): 编辑虚拟网络编辑器,修改子网IP 查看ip,输入ip addr 开启网络:ifup eth0 关闭网络:ifdown eth0 ...
- 史上最简单的 SpringCloud 教程 | 第一篇: 服务的注册与发现Eureka(Finchley版本)
转载请标明出处: 原文首发于:https://www.fangzhipeng.com/springcloud/2018/08/30/sc-f1-eureka/ 本文出自方志朋的博客 一.spring ...
- Rman 管理 archivelog 的命令
因为archivelog的相关信息是记录在controlfile中的,当物理删除后不会改变controlfile的设置.并且在查询相关的动态视图(例如v$archived_log)时,该部分日志仍然标 ...
- EasyUI加zTree使用解析 easyui修改操作的表单回显方法 验证框提交表单前验证 datagrid的load方法
带参提交一次查询,从服务器加载新数据.这是一个神奇的方法 $('#dg').datagrid('load',{ code: '01', name: 'name01' }); easyui修改操作的回显 ...
- iOS之已经审核通过的app在App Store上搜不到的解决办法
修改定价将你的app定价修改成0.99刀 修改你的发行范围,全取消后只选中国. save这时候你的app status将会变成pending contract. 将之前的修改都改回来,修改定价free ...
- Vue--- Vue(Pubsub + Ajax) 数据交互
案例知识点 兄弟组件儿的通信 使用了Pubsub 订阅与发布 ajax数据请求 获取前 获取中 获取后 获取为空 获取异常 获取成功后显示数据给到 原先定义号的 ...
- Zabbix 3.x中使用Percona Monitoring Plugins监控MySQL
1.下载安装percona-zabbix-templates-1.1.7-2.noarch.rpm 下载地址:https://www.percona.com/downloads/percona-mon ...
- 吐血分享:QQ群霸屏技术教程2017(活跃篇)
热门词的群排名,在前期优化准备充分的情况下,活跃度不失为必杀技. 在<吐血分享:QQ群霸屏技术(初级篇)>中,我们提及到热门词的群排名,有了前面的基础,我们就可以进入深度优化,实现绝对的霸 ...
- Yii 2.0.6 - 从入口到Action执行
defined('YII_DEBUG') or define('YII_DEBUG', true); defined('YII_ENV') or define('YII_ENV', 'dev'); r ...
- JS 红包随机
微信随机红包,指定金额指定用户,随机发送红包 var moneys = new Array(); var moneyTotal = 0; function rand(obj){ if(obj.size ...