C++梳理

C++编译执行过程:

预处理、编译、汇编、链接

预处理:将所有的#include头文件及宏定义替换成其真正的内容,预处理之后得到的仍然是文本文件,但文件体积会大很多。

预处理指令:#开头指令

#include指令

第一种方法将待包含的头文件使用尖括号括起来,预处理程序会在系统默认目录或者括号内的路径查找,通常用于包含系统中自带的公共头文件。
第二种方法将待包含的头文件使用双引号引起来,预处理程序会在程序源文件所在目录查找,如果未找到则去系统默认目录查找,通常用于包含程序作者编写的私有头文件。

#define、undef指令

只在预编译过程中做文本替换,不进行类型检查和计算求解。

好处是没有函数调用的额外开销,运行速度快。

坏处是容易出错,大量的宏替换会增加代码的长度。

宏定义中的#运算符把跟在其后的参数换成一个字符串,称为字符串化运算符。

宏定义中的##运算符把其前后的两个宏参数合为一个。

注意:宏参数中输入另一个宏时只有当前宏生效,参数中的宏不会展开。解决办法:增加中间转换宏。

(摘自:C语言中"#"和"##"的用法_星河的博客-CSDN博客

#ifdef、#ifndef、#endif指令

检查宏是否已定义,通常可用于防止重复包含头文件的问题。(在文件最开始的#pragma once也可以实现保证头文件只被编译一次的操作,产生于#ifndef之后,#ifndef方式受C/C++语言标准的支持,不受编译器的限制,#pragma once有些较老的编译器,如GCC 3.4之前的版本不支持)。

#if、#elif、#else、#endif指令
这几个指令称为条件编译指令,可对程序源代码的各部分有选择地进行编译。
跟一般的if、else if、else语句类似,如果一个条件上的值为真,则编译它对应的代码,否则提过这些代码,测试下一个条件上的值是否为真。注意,作为条件的表达式是在编译时求值的,它必须仅含常量及已定义过的标识符,不可使用变量,也不可以含有操作符sizeof(sizeof也是编译时求值)。
命令#endif标识一个#if块的结束。

(预处理指令部分摘自:C/C++中的预编译指令_sunshinewave的专栏-CSDN博客_c++预编译

编译:将经过预处理之后的程序转换成特定汇编代码的过程。

汇编:将编译来的汇编代码转换成机器码,产生目标二进制文件。

链接:将相关目标文件彼此相连接。

静态链接:在这种链接方式下,函数的代码将从其所在的静态链接库中被拷贝到最终的可执行程序中。这样该程序在被执行时这些代码将被装入到该进程的虚拟地址空间中。静态链接库实际上是一个目标文件的集合,其中的每个文件含有库中的一个或者一组相关函数的代码。

动态链接:在此种方式下,函数的代码被放到称作是动态链接库或共享对象的某个目标文件中。链接程序此时所作的只是在最终的可执行程序中记录下共享对象的名字以及其它少量的登记信息。在此可执行文件被执行时,动态链接库的全部内容将被映射到运行时相应进程的虚地址空间。动态链接程序将根据可执行程序中记录的信息找到相应的函数代码。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值