内存模型和名称空间
内存模型和名称空间.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章)实现不同。因此不同编译器创建的二进制模块很可能无法正确的链接。所以在链接编译模块时,请确保所有对象文件或库都是由同一个编译器生成的。如果有源代码,可以用自己的编译器重新编译源代码来消除链接错误。