前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >专栏 >宏替换、条件编译、头文件展开

宏替换、条件编译、头文件展开

作者头像
海盗船长
发布于 2020-08-27 09:21:48
发布于 2020-08-27 09:21:48
2.3K00
代码可运行
举报
文章被收录于专栏:基础知识文章基础知识文章
运行总次数:0
代码可运行

宏替换、文件编译和头文件的展开

程序执行的几个步骤:

1.预处理:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
①将头文件展开

②宏替换

③条件编译

④去掉注释

2.编译:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
①语义语法纠错

②将.c文件编译成汇编语言

3.汇编:将汇编语言变成二进制机器语言

4.链接:将所有的目标文件和依赖的库文件进行汇总,得到最终的可执行程序 以下开发工程中经常用到的部分预处理指令:

#define <#macro#> // 定义宏

#undef <#macro#> // 取消宏

#if <#condition#> // 如果给定的condition为真,则编译下面的代码

#ifdef <#macro#> // 如果宏已定义,则编译下面的代码

#ifndef <#macro#> // 如果宏没有被定义,则编译下面的代码

#elif <#condition#> 如果前面的#if给定条件为假,当前的条件为真,则编译下面的代码

#endif // 结束一个#if…#else条件编译块

#error <#message#> // 停止编译并显示错误信息

宏的定义

#define机制包括了一个规定,允许把参数替换到文本中,这种实现通常称为宏或定义宏。

宏替换

步骤: ①在调用宏时,首先对参数进行检查,看看是否包含了任何由#define定义的符号。如果是它们首先被替换。 ②替换文本随后被插入到程序中原来文本的位置。对于宏,参数名被他们的值所替代。 ③最后,再次对文本结果进行扫描,看看是否包含了任何由#define定义的符号。如果是就重复上述处理过程。 这样,宏定义参数和#define定义可以包含其他#define定义的符号。但是,宏不可以出现递归。 例如:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define PRINT(Val) printf(#Val " = %d\n", Val)	
//期望打印的值是:
	//10+20 = 30
	PRINT(10+20);
	//相当于
	printf("10+20" " = %d\n", 10 + 20);

宏中的运算符

在定义宏时,经常会出现的两个运算符 # 和 ##

#:出现在宏定义中的#运算符,会将其后面参数转化为一个字符串。我们把这种用法的成为字符串化运算符。 ##:常用于把多个参数连接在一起。

条件编译指令

1、#if 指令用于检测后面的常量表达式,如果为真,则编译接下来的代码,直到出现 #else、#elif、#endif为止;否则就不编译。

2、#endif 指令用于终止#if预处理指令。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
// 由于定义的AXE_TAG宏代表0,#if条件为假,不编译后面的代码,直到#endif,最后只输出
BB。去掉 #define AXE_TAG 0语句,效果也是一样的。
#if AXE_TAG
        printf("AA\n");
#endif
        printf("BB\n");
        
    }
    return 0;
}

3、#ifdef和#ifndef

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _FBI_WARNING_
 
int main(int argc, const char * argv[]) {
 
#ifdef _FBI_WARNING_
        printf("YES\n");
#endif
        
#ifndef _FBI_WARNING_
        printf("NO\n");
#endif
 
        /*等价于*/
        
#if defined(_FBI_WARNING_)
        printf("YES\n");
#endif
        
#if !defined(_FBI_WARNING_)
        printf("NO\n");
#endif        
    }
    return 0;
}

4、#else指令

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _FBI_WARNING_
 
int main(int argc, const char * argv[]) {    
#ifdef _FBI_WARNING_
        printf("YES\n");
#else
        printf("NO\n");
#endif
    }
    return 0;
}

5、#elif指令 #elif预处理指令综合了#if和#else指令的作用

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
#define _FBI_WARNING_
 
int main(int argc, const char * argv[]) {
#ifdef _FBI_WARNING_
        printf("YES\n");
#elif FBI_WARNING
        printf("Unknown\n");
#else
        printf("NO\n");
#endif
    }
    return 0;
}

头文件的展开

①#include指令使另外一个文件被编译:预处理器先删除这条指令,并用包含文件的内容替换。这样一个文件被包含10次,那就实际被编译10次。 ②库文件一般用 < > 包含;本地文件一般用 “ ” 包含。 ③文件开头写:#pragma once 可以避免头文件的重复引入。 以上总结,有不足和有误的地方还望指出!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2019/08/19 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
Oracle PL/SQL入门语法点
PL_SQL:带有分支和循环,面向过程 匿名块: declare(可选,声明各种变量和游标的地方) begin(必要的,从此开始执行) exception(抓取到异常后执行的) end; [sql] view plaincopy set serveroutput on;(默认是关闭) --最简单的PL/SQL语句块 begin dbms_output.put_line('HelloWorld!'); end; --最简单的语句块 declare v_name varchar2(20); be
java干货
2021/02/19
4900
PL/SQL --> 流程控制
类似于高级语言,流程控制语句是PL/SQL语言的重要组成部分。这些流程控制语句使得PL/SQL加大了代码的灵活性和多样性,大大简化了
Leshami
2018/08/07
4200
pl/sql编程语言
ena emp.ename%type; --引用型变量,直接取出emp表中ename的类型给ena
主机优惠
2019/06/20
6.6K0
​oracle 笔记
一、 oracle介绍 ORACLE 数据库系统是美国 ORACLE 公司(甲骨文)提供的以分布式数据库为核心的一组 软件产品,是目前最流行的客户/服务器(CLIENT/SERVER)或 B/S 体系结构的数据库之一。 比如SilverStream 就是基于数据库的一种中间件。ORACLE 数据库是目前世界上使用最为广泛的数据 库管理系统,作为一个通用的数据库系统,它具有完整的数据管理功能; 作为一个关系数据库, 它是一个完备关系的产品;作为分布式数据库它实现了分布式处理功能。但它的所有知识,只 要在一种机型上学习了ORACLE 知识,便能在各种类型的机器上使用它。
千羽
2021/07/20
9040
​oracle 笔记
PLSQL-简单的语句块及变量的定义
简单的语句块及变量的定义 常用数据类型变量的定义 declare sNum number(1); sCount binary_integer := 0; --默认值0 sSal number(7, 2) := 5000.00; --7位数,精度2位 sDate date := sysdate; sPI number(3, 2) := 3.14; sValid boolean := true; sName varchar2(20) := 'Jack
字母哥博客
2020/09/23
7500
javaweb-oracle-2-58
—第一:视图可以屏蔽掉一些敏感字段。 —第二:保证总部和分部数据及时统一。 视图为多表查询提供了上层封装,可以屏蔽某些字段的查询,可以统一操作各表,防止各表查询等操作不及时,信息不统一
全栈程序员站长
2021/05/19
9720
PLSQ编程
LOOP 要执行的语句; EXIT WHEN <条件语句> /条件满足,退出循环语句/END LOOP;
全栈程序员站长
2022/07/05
1.5K0
Oracle数据库之第四篇
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
海仔
2019/10/22
9510
PL/SQL --> 动态SQL
使用动态SQL是在编写PL/SQL过程时经常使用的方法之一。很多情况下,比如根据业务的需要,如果输入不同查询条件,则生成不同的执行
Leshami
2018/08/07
2.2K0
Oracle应用实战八(完结)——存储过程、函数+对象曹组
游标 在写java程序中有结果集的概念,那么在pl/sql中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。 游标可以理解为是PL/SQL中的结果集,我们通过游标可以提取结果
Java帮帮
2018/03/19
1.9K0
Oracle应用实战八(完结)——存储过程、函数+对象曹组
PL/SQL --> 异常处理(Exception)
Exception是一种PL/SQL标识符,当运行的PL/SQL块出现错误或警告,则会触发异常处理。为了提高程序的健壮性,可以在PL/SQL块中引
Leshami
2018/08/07
1.7K0
Oracle SQL 异常处理
有预定义异常 与 用户自定义异常 还有 raise_application_error()函数 raise_application_error() 只能把异常抛出而不能处理异常。
星哥玩云
2022/08/17
6780
Oracle SQL 异常处理
PL/SQL 编程(一)基础,变量,分支,循环,异常
SQL和PL/SQL: SQL 结构化查询语言(Structural Query Language),是用来访问和操作关系型数据库的一种标准通用语言,属于第四代语言(4GL)。可以方便的调用相应语句来去的结果,特点是非过程化,使用的时候不用指明执行的具体方法,不用关注实现的细节,但是某些情况下满足不了复杂业务流程的需求。 PL/SQL是 Procedure Language & Structured Query Language 的缩写。属于第三代语言(3GL),是一种过程化语言。PL/SQL是对SQL语言
二十三年蝉
2018/02/28
1.7K0
PL/SQL 编程(一)基础,变量,分支,循环,异常
Oracle学习笔记四
在写java程序中有集合的概念,那么在pl/sq中也会用到多条记录,这时候我们就要用到游标,游标可以存储查询返回的多条数据。
Kevin_Zhang
2018/09/20
1.3K0
Oracle学习笔记四
Oracle PL/SQL编程之变量
注: 以下测试案例所用的表均来自与scott方案,使用前,请确保该用户解锁. 1、简介 和大多数编程语言一样,在编写PL/SQL程序时,可以定义常量和变量,在pl/sql程序中包括有: a、标量类型(Scalar) b、复合类型(Composite) c、参照类型(Refrence) d、lob(large object)类型 下面来一一介绍 2、标量(Scalar)类型       只能存放单个值的变量 在编写pl/sql语句时,如果需要用到变量,那么就需要在定义部分定义变量。pl/sql中定义变量个常量
郑小超.
2018/01/26
1K0
Oracle-PL/SQL基础
pl/sql(procedural language/sql)是Oracle在标准的sql语言上的扩展,pl/sql不仅允许嵌入Sql语言,还可以定义变量和常量,允许使用条件语句和循环语句,允许使用例外处理各种错误,这样使得它的功能变得更加强大。
小小工匠
2021/08/16
1.8K0
Oracle游标使用详解
本节对Oracle中的游标进行详细讲解。本节所举实例来源Oracle中scott用户下的emp表dept表:
星哥玩云
2022/08/17
4K0
Oracle游标使用详解
Oracle总结【PLSQL学习】
PLSQL介绍 PLSQL是Oracle对SQL99的一种扩展,基本每一种数据库都会对SQL进行扩展,Oracle对SQL的扩展就叫做PLSQL… SQL99是什么 (1)是操作所有关系型数据库的规则 (2)是第四代语言 (3)是一种结构化查询语言 (4)只需发出合法合理的命令,就有对应的结果显示 SQL的特点 (1)交互性强,非过程化 (2)数据库操纵能力强,只需发送命令,无需关注如何实现 (3)多表操作时,自动导航简单,例如: select emp.empno,emp.sal,dept.dname fr
Java3y
2018/03/15
2.4K0
Oracle总结【PLSQL学习】
PL/SQL --> 存储过程
存储过程子程序的一种类型,能够完成一些任务,作为schema对象存储于数据库。是一个有名字的PL/SQL代码块,支持接收或不接受参数
Leshami
2018/08/07
1.4K0
PL/SQL 编程(二)游标、存储过程、函数
游标--数据的缓存区 游标:类似集合,可以让用户像操作数组一样操作查询出来的数据集,实质上,它提供了一种从集合性质的结果中提取单条记录的手段。 可以将游标形象的看成一个变动的光标,他实质上是一个指针,在一段Oracle存放数据查询结果集或者数据操作结果集的内存中,这个指针可以指向结果集任何一条记录。 游标分静态游标和REF游标两类,静态游标包含显式游标和隐式游标。 显式游标: 在使用之前必须有明确的游标声明和定义,这样的游标定义会关联数据查询语句,通常会返回一行或多行。打开游标后,用户可以利用游标的位置对结
二十三年蝉
2018/02/28
3.8K0
相关推荐
Oracle PL/SQL入门语法点
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文