2013-04-25 80 views
0

我一直想知道编译> 1000行代码的项目的最佳方法。关于编制项目的最佳方式,我只是有一些基本问题。我使用GCC,如果它有所作为。我的问题是:关于汇编的问题

  • 在多个源文件中包含库是否会导致函数被复制两次?

我的意思是,如果我有两个文件是这样的:

Souce.c

#include<stdio.h> 
... 
void static test_func(){ printf("Hey!"); } 

Source2.c

#include<stdio.h> 
... 
void static test_func(){ printf("Hey!"); } 

请问功能,printf的,得到复制到可执行文件两次?我想我想避免这种情况,因为很多时候我会有多个源文件共享相同的头文件,我想知道这是不是一个坏习惯。

有一次,我只包括使用这种其他的源文件:

由source.c

#include<stdio.h> 
#include "source2.c" 

但我不知道如果这,还有,是一个不好的做法与否。这导致我到另一个问题:

  • 是否包括源文件一个不好的做法?

注意:通过不好的做法,我的意思是如果某件事情是违背约定或导致某种低效率。

编辑:我刚刚读过,图书馆之间共享的文件。我的客人,这意味着我的第一个问题的答案是否定的。然而,如果包含使用预处理器的源文件是普遍的做法,我很好奇。

回答

1

注意,像stdio.h库的头文件仅包含声明printf函数的动态库文件;它们不包含那些函数的实际代码。当所有目标文件和相关库被组合起来形成最终的可执行文件时,在链接时添加printf等功能的实际代码。

包括你的例子中的源文件,通常被认为是不好的做法,虽然可能有特定的用例;我不能想到任何好的东西。您发生重复定义错误的风险更高,并且您不必要地重建代码。编译器可能会限制它在一次会议中可以消化多少代码;包括包含源文件的源文件的源文件可能会导致构建时间过长或更糟糕。已经有一段时间了,但是我看到编译器会在非常大的文件上窒息,特别是如果你想优化输出。 (通常)不需要重建整个项目(当然,这取决于被更改的内容);如果我只改变一个文件中的某些内容,我通常不需要重建整个项目。我只需重新编译一个文件并重新链接即可。

1

静态链接期间库函数仅包含一次。如果库是动态的,则根本不添加副本,只有动态链接信息。

包括.c文件很奇怪,除非你有特定的理由这样做。其中一个原因是外部模块测试程序,其中根本不需要模块中的main函数,但同时为了正确测试它,main需要访问所有文件静态无法通过不同文件访问的数据。

1

不包括跨文件库多次不会使它包含在最终的可执行多次

链接器负责解决的功能,当它发现它已经知道的功能,它已经包含了它不会尝试再次将其包含在静态链接中。链接程序将确保它仅包含包含静态链接中特定定义的必需文件。

在动态链接,链接器将加载所需要通过在运行时应用到存储器