c++进阶教程:我见过最好的c++教程

在#符号之后的都是预处理语句,编译器收到源文件后会预先处理。之所以叫预处理语句,是因为在实际编译发生之前就被处理了。

#include<iostream>
int main()
{
    std::cout << "Hello world!" << std::endl;
    std::cin.get();
}


  include的含义是需要找个一个文件,在这里指的是需要找到叫iostream的文件,然后将该文件的所有内容拷贝到现在的文件内,这些所包含的文件通常被成为“头文件”。这里我们包含iostream这个头文件,是因为需要一个被调用函数的声明,std::cout可以让我们在终端打印东西。
   main函数是程序的入口,当我们运行程序时计算机从这个函数开始执行代码。main函数比较特殊,虽然返回类型是int,但是代码中没有返回任何东西,这时会默认返回0。
  << 符号叫做重载运算符,可以理解为一个函数,将字符串Hello world!推送到cout流中,然后打印到终端,然后推送一个行结束符,endl告诉终端跳到下一行。cin.get函数是等待我们按下enter键,在前往下一句代码之前等待,这个时候程序暂停执行。


转换成可执行的二进制文件

  因为预处理,编译器会将iostream文件内容全部包含进来,即拷贝粘贴内容到代码文件中,所有我们可以使用cout cin这些函数。预处理结束以后,我们的文件将被编译,编译器会将所有的C++代码转化为实际机器代码。
  项目中的每一个cpp文件都会被编译,但是头文件不会被编译,头文件的内容在预处理时包含到了cpp中。每一个cpp文件都被编译为object file(目标文件),如果使用VS生成的文件后缀为.obj,我们需要将这些文件合并成一个执行文件,链接(Link)会将所有的obj文件黏合在一起,合并成一个.exe文件。
  VS中可以按crtl+F7进行编译,但我们编译Main.c这段单独的代码文件时,不会发生链接。 默认情况下,VS会输出构建文件到debug文件夹,在debug文件夹下我们可以看到main.obj文件如下图。

 这就是编译器生成的目标文件,对于项目中的每个C++文件都会生成一个obj文件。当我们选择build(生成)整个项目,这次就不是编译单个文件了,而是构建整个项目,实际上会生成How C++ Works.exe。

双击我们可以运行并打印Hello world!如下图。

多个C++文件

  假设我们仍然要打印Hello world!但不想使用cout函数,我们可以用自己写的logging函数来包裹cout函数。因此重写代码调用log函数而不使用cout函数,把Hello world!作为参数输入。

 #include<iostream>

void Log(const char* message) {
    std::cout << message << std::endl;
}

int main()
{
    Log("Hello World!");

    std::cin.get();
}

 译器是怎么实际运行到正确的代码的?这就要用到链接了,当我们构建一整个工程时,不止一个文件时。build(生成)这个项目,所有的文件都会被编译,链接器会找到正确的的Log函数定义在哪里,将函数定义导入到Log函数中。若找不到就会出现链接错误。编译器会为每一个源文件生成一个obj文件,链接器会将它们合并成一个exe文件如下图。

猜你喜欢

转载自blog.csdn.net/qq_34904125/article/details/125884085