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


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

    #include
    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

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

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

        std::cin.get();
    }

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

     

  • 相关阅读:
    ASEMI肖特基二极管MBR10100CT参数,MBR10100CT封装
    计算机毕业设计Java重工教师职称管理系统(源码+系统+mysql数据库+lw文档)
    有没有一段代码,让你为人类的智慧所折服
    【书城项目】第二阶段-用户注册和登陆
    最适合运动的耳机类型是什么、最适合运动的耳机推荐
    gcc和Makefile,多文件编译器
    深度解读MediaBox SDKs如何实现技术架构升级
    SpringBoot - @InitBinder注解详解
    MySQL数据库基本操作+用户管理+用户授权
    C#接口和继承的区别、联系与使用场景
  • 原文地址:https://blog.csdn.net/qq_34904125/article/details/125884085