下面是C++入门的hello world
程序源码
#include <iostream>
using namespace std;
int main(int argc, char* argv[])
{
cout << "hello world" << endl;
return 0;
}
你可以在将上述源码复制粘贴到我的在线编译上执行。
程序各行解析
-
#include <iostream>
引入iostream
头文件。
-
using namespace std
使用std
命令空间,命令空间可防止名称污染。
-
int main(int argc, char* argv[])
入口函数定义,入口函数是由操作系统调用的。
-
cout << "hello world" << endl
在控制台打印hello world
字符串,cout
中控制台输出设备抽象出来的对象,<<
是cout的输出运算符(也可以理解为输出设备的print
方法),endl
是换行标志。
-
return 0
向操作系统返回一个整形处理结果,操作系统会捕获这个整形数,一般程序执行成功会返回0
,执行异常会返回负数。
hello world
程序如何运行
编程语言编写的源代码实际上是人类可以理解自然语言,但计算机只认识二进制指令,所以我们要将源代码翻译成二进制机器码,这样计算机才能知道你的意图。这个将源代码翻译成二进制机器码的过程我们称之为编译。C++的整个编译过程又可细分为以下步骤:
-
预处理
预处理可以简单理解为编译器将源码中的预处理指定(以#
号开头行)转换成相应代码。如#include
指令就是将#include
指定的文件直接包含进来。
-
将源文件转换成目标文件
将源文件(.cpp
文件)转换成目标文件(.o
文件),这个过程就是前源代码转换成二进制机器码,但针对源代码中引用其他类库的变量、函数编译器只知道他们的声明(一般包含在头文件中)也不知道其定义,所以编译只会检查变量、函数是否已声明,函数调用参数与声明是否一致,做完这些操作后编译器的任务就完成了,最终编译输出目标文件(.o
文件)。
-
目标文件与库文件进行链接
将目标文件中引用其他库的变量、函数等与二进制库文件中定义变量进行替换或建立关联关系。如果是变量、函数在静态库中定义,则链接器会将静态库中变量、函数定义打包复制一份到最终程序文件中,然后修改变量、函数的指向程序中的具体偏移地址。如果是变量、函数在动态库中定义,则链接器会将变量、函数指向动态库中具体地址。完成上面操作后生成可执行文件。
-
执行可执行文件
在控制台输入可执行文件路径或在资源管理器中双击可执行文件就可运行可执行程序,程序实际上是操作系统装载运行的,操作系统能理解程序的二进制文件格式,然后分配程序执行所需的栈空间、代码段、静态存储区、映射堆空间地址等,操作系统会创建一个进程结构体来管理进程,然后将进程放入就绪队列,等待CPU调度运行。进程的内存模型大致如下:
上面hello word
程序中的main函数实际上是操作系统调用的,main函数执行完成会返回一个整形变量给操作系统。我们可以认为main函数是程序执行入口函数,但main并不是程序执行开始,全局变量的初始化(构造函数)是在进入main函数之前进行,相应的main函数return语句也是程序执行的最后代码,全局变量的销毁(析构函数)是在main函数结束之后执行的。