欢迎光临散文网 会员登陆 & 注册

1. CPP 是如何工作的

2023-07-17 16:52 作者:居苦痛人  | 我要投稿

§1 第一个程序:Hello World

程序源码与解释

程序源码

#include 指令 #include 指令用于搜索引用在 < > 内的文件,  并将该文件复制粘贴到源文件中. 上例中所寻找的文件便是 iostream, 该文件声明了 cout, cin 等函数.

main() 函数 main() 函数是整个 CPP 程序的入口, main() 函数结束时, 程序便结束了.

在 C 语言的基础上, 容易知道, CPP 的 main() 函数的返回值为 int 类型, 即一个整数. 然而, 程序源码中并未使用 return 语句说明返回值, 而对一般的返回值非 void 的函数, 这是非法的. 事实上,  在 CPP 中, 对 main() 函数而言, 若未使用 return 语句返回一个整数, 它会默认以 0 作为返回结果.

Pic.1 CPP main() 函数默认返回值

重载运算符与 CPP 流式输出 重载运算符是 CPP 区别于 C 的一大新特性. CPP 允许将一些已有定义的运算符重载为用于新运算的运算符. 上例中, << 这个左移运算符被重载为输出运算符, 用于在屏幕上打印出字符串.

事实上, 所谓的重载运算符, 本质上是一个函数. 所以上例中的输出代码还可以改写为

这段代码 (以及程序源码 中的输出代码) 的作用是向 std::cout, 即 CPP 输出流中推送字符串 Hello, World! 和行换行符.

其他处理 为防止程序在打印语句后直接关闭终端窗口 (由于速度过快以至于看不清输出是否正确), 可通过

解决. 该函数等待我们输入任意一个字符, 在执行完该函数后, 程序将结束运行.

通过 Visual Studio 编译运行它

在建立完一个空项目并确定好其位置后, 有以下几种方式编译单个文件.

  1. 快捷键 Ctrl + F7.

  2. 工具栏的编译按钮.

除此外, 由于该项目目前只有一个文件 (一般命名为 Main.cpp), 所以也可以直接编译项目而不用担心链接错误.

  1. 右键项目并点击生成.

  2. 快捷键 Shift + F7.

§2 CPP 程序的编译过程

预处理

上述源码将送至编译器中编译为可执行二进制码.

在编译之前, 当编译器读到 # 时, 将认定该语句为预处理指令, 并执行预处理.

预处理指令 以 # 开头的, 只占一行的语句. 它总是出现在 CPP 程序开头.

预处理 在编译前对预处理指令的执行过程.

编译

在编译阶段, 程序将源程序代码转换为二进制码.

Visual Studio 中的编译配置 在 Visual Studio 中, 编译配置分为两个重要的部分,

  1. 解决方案配置. 其存在两个默认选项: Debug 和 Release.

  2. 解决方案平台. 其存在多个默认选项, 这取决于用户配置的开发平台的多少. 仅对 Windows 平台开发而言, 它分为 x64 和 x86 (WIN32) 两种, 前者表示 64 位系统程序, 后者表示 32 位系统程序.

解决方案配置实质上是构建项目时的一系列规则, 而解决方案平台是指该项目运行的目标平台.

其他详细信息, 请参考 Microsoft Visual Studio 帮助文档.

为何 Debug 要比 Release 慢 对 Visual Studio 而言, Debug 默认关闭代码优化, 而 Release 总是以最大速度优化. 前者对代码调试是有好处的.

编译器的编译对象 项目中的每个 CPP 文件都将被编译, 而头文件不会. 事实上, 所用的头文件将会在预处理后被复制在各个包含了它们的 CPP 中, 从而与 CPP 一同被编译.

在 Visual Studio 中, 项目中的每个 CPP 文件都将被编译为 .obj 文件 (目标文件 Object File).

链接

编译器将所有 CPP 源文件编译为独立的目标文件. 然而, 一个项目大多只需要一个可执行文件, 将这些独立的目标文件按照一定顺序合并为一个可执行文件, 便是链接器的工作.

为了进一步说明链接, 试作如下例子

声明 在 CPP 中, 任何符号都需要声明. cout, cin 等等已经在 iostream 文件中声明. 因此, 只有通过 #include 指令包含 iostream 才能使用 cout, cin 等. 声明用于告知编译器对象对象存在.

声明的写法很简单

只需要告知函数名, 函数返回值类型和函数的参数类型列表即可.

定义 定义是指一个函数所实现的具体功能. 这个具体功能将被放在函数体, 即两个花括号 { } 之间的位置.

链接错误 当链接器找不到已经声明并调用的函数所在位置时, 将会告知链接错误. (将上述 Log.cpp 中的 Log() 函数名修改即可复现该类错误.)

Pic.2 链接错误

链接错误分为以下几部分:

  1. 说明该符号无法解析. 因为编译器先解析该符号, 然后去寻找它的位置.

  2. 调用该符号的系统内部命名.


1. CPP 是如何工作的的评论 (共 条)

分享到微博请遵守国家法律