; #endif
用 header 档的档名(大写的)代替上面的
FILENAME_H,用底线 代替档名中的点。有些人喜欢在 #endif 加上注释来提醒他们这个 #endif 指的是什么。例如:
#endif /* #ifndef FILENAME_H */
我个人没有这个习惯,因为这其实是很明显的。当然这只是各人的 风格不同,无伤大雅。
你只需要在那些有编译错误的
header 档中加入这个技巧,但在所 有的 header 档中都加入也没什么损失,到底这是个好习惯。
1.5
重新编译一个多文件项目
清楚的区别编译和连接是很重要的。编译器使用源码文件来产生某种 形式的目标文件(object
files)。在这个过程中,外部的符号参考并 没有被解释或替换。然后我们使用连接器来连接这些目标文件和一些
标准的程序包再加你指定的程序包,最后连接生成一个可执行程序。 在这个阶段,一个目标文件中对别的文件中的符号的参考被解释,并
报告不能被解释的参考,一般是以错误信息的形式报告出来。
基本的步骤就应该是,把你的源码文件一个一个的编译成目标文件的格
式,最后把所有的目标文件加上需要的程序包连接成一个可执行文件。 具体怎么做是由你的编译器决定的。这里我只给出 gcc (GNU C 编译
器)的有关命令,这些有可能对你的非 gcc 编译器也适用。
gcc 是一个多目标的工具。它在需要的时候呼叫其它的元件(预处理
程序,编译器,组合程序,连接器)。具体的哪些元件被呼叫取决于 输入文件的类型和你传递给它的开关。
一般来说,如果你只给它C源码文件,它将预处理,编译,组合所有 的文件,然后把所得的目标文件连接成一个可执行文件(一般生成的 文件被命名为 a.out
)。你当然可以这么做,但这会破坏很多我们 把一个项目分解成多个文件所得到的好处。
如果 |