不會(huì )。當啟動(dòng)連接程序時(shí),它會(huì )尋找“未定義的外部函數”,也就是說(shuō),它將在每一個(gè)庫文件中查找源代碼文件中未定義的函數。當它找到一個(gè)未定義的外部函數后,它會(huì )引入包含該函數定義的目標代碼。(obj)。不幸的是,如果這個(gè)函數是在一個(gè)包含其它函數定義的源文件中被編譯的話(huà),那么這些函數也會(huì )被包含進(jìn)來(lái),你的可執行代碼中將包含一些不需要的代碼。因此,將庫函數放到各自的源文件中是很重要的——否則會(huì )浪費寶貴的程序空間。有些編譯程序包含
特殊的“精明的”連接程序,這些連接程序能查出不需要的函數并去掉它們,從而使這些函數不再進(jìn)入你的程序。
下面舉一個(gè)例子:假設有兩個(gè)源文件,分別為libfunc1.c和libfunc2.c,它們所包含的函數都要被放到一個(gè)庫中。源文件libfunc1.c包含以下兩個(gè)函數:
void func_one ()
{
...
}
void rune_two()
{
...
}
源文件libfunc2.c包含以下函數:
void func_three()
{
...
}
現在假設已經(jīng)把這兩個(gè)源文件編譯到一個(gè)名為myfuncs.1ib的庫中。如果一個(gè)與myfuncs.lib連接的程序要調用func_one()函數,連接程序就會(huì )在myfuncs.lib庫中尋找包含func_one()函數定義的目標代碼,并且把它連接進(jìn)來(lái)。不幸的是,函數func_one()是在包含func_two()函數定義的同一個(gè)源文件中被編譯的,因此,即使你的程序不會(huì )用到func_two(),連接程序也不得不把它連接進(jìn)來(lái)。當然,這里假設func_one()中并沒(méi)有包含對func_two()的調用。如果一個(gè)程序包含一個(gè)對func_three()的調用,那么只有func_othree()的目標代碼會(huì )被連接進(jìn)來(lái),因為該函數是在它自己的源文件中被編譯的。
一般說(shuō)來(lái),你應該盡量把庫函數放到各自的源文件中。這種組織方式有助于提高程序的效率,因為程序只會(huì )和那些真正需要的函數進(jìn)行連接,而不會(huì )和那些不需要的函數進(jìn)行連接。這種組織方式在小組開(kāi)發(fā)的情況下也是很有幫助的;在小組開(kāi)發(fā)中,源文件的上交和發(fā)放非常頻繁,如果一個(gè)程序員要對一個(gè)包含在其自身的源文件中的函數進(jìn)行維護,那么他可以集中維護這個(gè)函數;如果這個(gè)函數所在的源文件中還包含其它一些需要維護的函數,那么這些函數就無(wú)法發(fā)放給其它小組成員,因為它們包含在一個(gè)源文件中。
聯(lián)系客服