内存模型和名称空间

内存模型和名称空间.md#

  • 单独编译
    • c++允许甚至鼓励将组件函数放在独立的文件中。
    • 可以单独编译这些文件,如何将他们链接成可执行文件。
    • c++编译器既编译程序也管理链接器。
    • 如果只修改了一个文件,则可以只重新编译该文件。
    • 多数c++环境都提供了其他工具来帮助管理。例如make。
    • 运行make时,如果它检测到上次编译后修改了源文件,make将记住重新构建程序所需的步骤。
    • 可以将原来的程序分为3部分
      • 头文件:包含结构声明和使用这些结构的函数的原型。
      • 源代码文件:包含与结构有关的函数的代码。
      • 源代码文件:包含调用与结构相关的函数的代码。
      • 采用该结构,如果编写另一个程序时,也需要使用这些函数,则只需包含头文件,并将函数文件添加到项目列表或make列表中。
      • 请不要将函数定义和变量声明放到头文件中。如果在头文件中包含了一个函数定义,在其他两个文件中包含该头文件,则同一个程序将包含同一个函数的两个定义。除非函数是内联的。
    • 头文件中应该包含的内容
      • 函数原型
      • 使用#define或const定义的符号常量,const有特殊的链接属性。
      • 结构声明,不创建变量
      • 类声明
      • 模板声明,指示编译器如何生成与源代码中函数调用相匹配的函数定义。
      • 内联函数,有特殊的链接属性。
    • 不要使用#include来包含源代码文件,这样将导致多重声明。
    • 1编译两个源代码文件g++ file1.cpp file2.cpp
    • 2预处理器将包含的头文件与源代码文件合并生成临时文件temp1.cpp temp2.cpp
    • 3编译器创建每个源代码文件的目标代码文件file1.o file2.o
    • 4链接程序将目标代码、库文件、和启动代码合并,生成可执行文件 a.out
    • 头文件管理
      • 在同一个文件中只能将同一个头文件包含一次。
      • 但在某些情况下可能使用包含了另一个头文件的头文件。
      • 有一种技术可以避免多次波阿虎同一个头文件。
      • 基于预处理器编译指令#ifndef。
      • ifndef COORDIN_H_

      • 。。。
      • endif

      • 上述代码表示没有使用预处理器编译指令#define定义名称COORDIN_H_时,才处理#ifndef和#endif之间的语句。
      #ifndef COORDIN_H_
      #define COORDIN_H_
      //...
      #endif
      
      • 编译器首次遇到该文件时,COORDIN_H_没有定义,这时编译器将查看#ifndef和#endif之间的内容。如果再次遇到该文件时,COORDIN_H_已经被定义。只是编译器将跳过该文件的内容,所以避免了编译器将文件包含两次。

    • 多个库的链接
      • c++标准运行每个编译器的名称修饰(看第8章)实现不同。因此不同编译器创建的二进制模块很可能无法正确的链接。所以在链接编译模块时,请确保所有对象文件或库都是由同一个编译器生成的。如果有源代码,可以用自己的编译器重新编译源代码来消除链接错误。
posted @ 2019-12-02 23:09  yangzixiongh  阅读(224)  评论(0编辑  收藏  举报