将写好的源文件(.cpp)通过编译器的处理生成可执行文件(.exe)的过程称之为翻译,其中包括编译和链接两个过程。
其中编译是将项目中的所有源文件(.cpp)通过编译器都分别单独生成一个目标文件(.obj)(不理解这个会产生一个重大的错误),随后,连接器会将项目中的所有目标文件链接起来,成为一个可执行文件。这就是翻译的过程。
这里说一下我曾经很喜欢犯的一个错误,这个错误就和编译的过程有关。
曾经我很喜欢在头文件中定义一个变量,总觉得这个变量是头文件中对实现头文件中的函数功能很有用,然后在编译的时候,经常出现“xxx已经在xxx.obj中定义”,起初我以为这是因为头文件的多次包含,所以我尝试使用“#ifndef”以及“#program once”来阻止头文件的多次包含,但事实是,重定义的报错仍然存在。
其实这里的重定义并不是我所想的那种重定义,“#ifndef”以及“#program once”的阻止头文件多次包含仅仅只是阻止在翻译的第一阶段,编译过程中,单个obj包含多次同一个头文件,而实际上,这里的报错结果是在链接过程中,多个obj包含同一个自定义头文件库造成的,就好像三个人要组成一个团队,每个人各有分工,结果来的时候发现每个人都拿了同样的铲子。
要解决的方法也很简单,就是在头文件中的变量,只使用extern声明,但是不定义,定义就到头文件对应的源文件去定义。
例如
//a.h
extern int num;
//a.cpp
int num = 0;
和头文件中的函数定义很像,不是嘛?