1.编译两个源代码文件


在UNIX系统中编译由多个文件组成的C++程序

2.头文件管理

在同一个文件中只能将同一个头文件包含一次。我们有可能在不知情的情况下将头文件包含多次。有一种标准的C/C++技术可以避免多次包含同一个头文件。它是基于预处理编译器指令#ifndef的。例如:

coordin.h

#ifndef _COORDIN_H_
#define _<span style="font-family: Arial, Helvetica, sans-serif;">COORDIN</span><span style="font-family: Arial, Helvetica, sans-serif;">_H_</span>


#endif
编译器第一次遇到coordin.h时,_COORDIN_H_没有定义。在这种情况下,编译器将查看#ifndef与#endif之间的内容。当在同一个文件中再次遇到包含coordin.h的代码,编译器知道_COORDIN_H_已经被定义过,从而跳到#endif后面的一行上。注意,这种方法并不能防止编译器将文件包含两次,而是让它忽略除第一次包含之外的所有内容。大多数标准C/C++头文件都使用这种防护方案。否则,可能在一个文件中定义同一个结构两次,这将导致编译错误。

3.多个库的链接

C++标准允许每个编译器设计人员以他认为合适的方式实现名称修饰,因此由不同编译器创建的二进制模块很可能无法正确地链接。也就是说,两个编译器将为同一个函数生成不同的修饰名称。名称的不同将使链接器无法将一个编译器生成的函数调用与另一个编译器生成的函数定义匹配。在链接编译模块时,请确保所有对象文件或库都是由同一个编译器生成的。


名称修饰:C++如何跟踪每一个重载函数呢?它给这些函数指定了秘密身份。使用C++开发工具中的编辑器编写和编译程序时,C++编译器将执行一些神奇的操作——名称修饰(name decoration)或名称矫正(name mangling),它根据函数原型中指定的形参类型对每个函数名进行加密。以下是未经修饰的函数原型:

long MyFunctionFoo(int, float);
这种格式很适合阅读,我们知道函数接受两个参数,并返回一个long值。而编译器将名称转换为另一种内部表述,来描述该接口,如下所示:

?MyFunctionFoo@@YAXH
对原始名称进行的表面看来无意义的修饰将对参数数目和类型进行编码。添加的一组符号随函数特征标而异,而修饰时使用的约定随编译器而异。









Logo

瓜分20万奖金 获得内推名额 丰厚实物奖励 易参与易上手

更多推荐