标签:style blog class code tar ext
编译器不能检查跨越目标文件或编译单元之间的名称冲突,这是链接器的工作。链接器把不同编译单元中产生的符号联系起来,构成一个可执行程序。如:
//文件first.cpp int integerValue = 0; int main(){ int integerValue = 0; return 0; }; //文件second.cpp nt integerValue = 0; /* 错误: error LNK2005: "int integerValue" (?integerValue@@3HA) 已经在 second.obj 中定义 first.obj */
GCC将C++代码转为机器码,理论上需要四个步骤:预处理(preprocessing)、编译(compilation)、汇编(assembly)以及链接(linking)3;四个步骤对应四个主体:预处理器(preprocessor)、编译器(compiler)、汇编器(assembler)以及链接器(linker)。实际预处理与编译其实是一个步骤,共需要三个步骤:预处理&编译、汇编以及链接。参见:GCC的C++入门。
int integerValue = 0; //全局变量 int main(){ int integerValue = 0; ::integerValue=10; //切换到全局作用域 return 0; };
命名空间基本思想是,将相关的项目组合到一个特定的(已命名区域)。关键字namespace,用法类似结构体和类:namespace 名称{} 。对于已命名的命名空间,可以有多个实例。这些实例可以在一个文件中,也可在不同的编译单元,编译器会把它们合并成一个命名空间。
命名空间可以嵌套,因为命名空间的定义也是声明,如:
namespace Window{ namespace Pane{ int a; } } // 在命名空间外部访问就是: Window::Pane::a;命名空间中可以声明和定义函数,但是优秀的设计一般将接口(声明)和实现(定义)分开,所以命名空间定义中一般只放声明。详见Google C++ Style Guide 。添加新成员,只能在命名空间体体内进行。
标签:style blog class code tar ext
原文地址:http://blog.csdn.net/thisinnocence/article/details/25006451