| |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
-> C++知识库 -> 有关程序的编译与预处理 -> 正文阅读 |
|
[C++知识库]有关程序的编译与预处理 |
目录 1.程序的编译环境和执行环境在ANSI C的任何一种实现中,存在两个不同的环境。
2.编译与链接?我们先用一张图来简单示意一下程序的编译过程 ?简要的说分为以下几个步骤
?具体可细分为以下几个步骤: (1)预处理:展开头文件/宏替换/去掉注释/条件编译? (2)编译:对代码进行语法分析,句法分析,词义分析,符号汇总,并生成一个汇编文件(具体内容感兴趣的读者可阅读《编译原理》) (3)汇编:形成符号表,并将汇编指令转化为二进制指令,生成可重新定位目标文件 (4)链接:合并段表,符号表的合并和重新定位 ?之后我们就生成的可执行文件,下面我们看到程序的执行
3.预处理?在这一小节,我将着重介绍有关宏及函数相关知识,但首先,先让我们简单了解一下有关预定义符号。
这些符号都是C语言内置的,举个例子
这样就可以输出有关我们文件的信息了。 接下来我们看到#define相关知识点 (1):#define定义标识符
举个例子
?(2):#define定义宏
注意: 参数列表的左括号必须与name紧邻。 如果两者之间有任何空白存在,参数列表就会被解释为stuff的一部分。? 然后我们来看下面一段代码
一般来说,我们预期的输出结果应该是6*6=36,但事实上他打印的却是11。为什么?
在宏定义上加上两个括号,这个问题便轻松的解决了:
所以用于对数值表达式进行求值的宏定义都应该用这种方式加上括号,避免在使用宏时由于参数 中的操作符或邻近操作符之间不可预料的相互作用。 (3):关于#define的替换规则
(4):带副作用的宏参数 当宏参数在宏的定义中出现超过一次的时候,如果参数带有副作用,那么你在使用这个宏的时候就可能 出现危险,导致不可预测的后果。副作用就是表达式求值的时候出现的永久性效果。? 例如:
我们看到下面一个例子
之前我们提到过#define只是完成了简单的替换操作,所以经过预处理后实际上这串代码如下
所以实际的输出结果是:
(5):宏和函数的对比? ? 宏通常被应用于执行简单的运算。比如在两个数中找出较大的一个。
但是这里我们为什么不选择用函数来完成这个任务呢?
最后我们用一张表格来结束这篇文章: 有关宏和函数的对比?
|
|
C++知识库 最新文章 |
【C++】友元、嵌套类、异常、RTTI、类型转换 |
通讯录的思路与实现(C语言) |
C++PrimerPlus 第七章 函数-C++的编程模块( |
Problem C: 算法9-9~9-12:平衡二叉树的基本 |
MSVC C++ UTF-8编程 |
C++进阶 多态原理 |
简单string类c++实现 |
我的年度总结 |
【C语言】以深厚地基筑伟岸高楼-基础篇(六 |
c语言常见错误合集 |
|
上一篇文章 下一篇文章 查看所有文章 |
|
开发:
C++知识库
Java知识库
JavaScript
Python
PHP知识库
人工智能
区块链
大数据
移动开发
嵌入式
开发工具
数据结构与算法
开发测试
游戏开发
网络协议
系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程 数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁 |
360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 | -2024/11/24 6:16:21- |
|
网站联系: qq:121756557 email:121756557@qq.com IT数码 |