2013-03-05 22 views
0

我知道如果沒有找到該函數的原型,將會產生編譯器錯誤。但是讓我說我​​知道一個庫包含一些非公共函數,並且我爲它創建了自己的原型(匹配靜態庫中的一個),鏈接器是否能夠將其拉入?函數是否在靜態庫中,不在頭中公開,可訪問?

我問的原因是我創建了一個庫,我在這裏爲函數使用通用通用名稱,比如「init()」,它們只用於內部使用。我不知道他們是否會連接

回答

5

其在與庫之外的符號碰撞依賴於功能的聯動:

//.c file 

// external linkage, accessible from outside using the right prototype 
void foo(void) {} 

// internal linkage, not accessible from outside 
static void bar(void) {} 
+0

謝謝。如果我在一個文件中只有一個文件中有一個函數,那麼我只能通過另一個文件訪問它,但除此之外別無它法。處理這個問題的最好方法是什麼? – 2013-03-05 19:35:43

+3

@BrandonYates您不能在C中執行此操作。 – ouah 2013-03-05 19:40:35

0

原型是編譯器,而不是連接器的好處。編譯器會高興地編譯你聲明的任何函數的代碼,但如果你試圖使用在另一個文件或庫中定義爲靜態的函數,你會得到一個鏈接器錯誤。

如果不能在文件之外使用,則可以並且應該將自己的函數聲明爲靜態函數。但是,如果您隨後使用其他包含具有相同函數名稱的聲明的代碼進行編譯,則會發生衝突,除非它們的定義完全相同。例如,如果您將init函數定義爲靜態函數,則只能在該文件中直接使用它;但是如果你包含任何聲明另一個函數的頭文件,名稱爲init,你會得到一個錯誤。

(可以訪問在另一個文件中的靜態功能,但它需要的指針。)

+0

如果您將幾個文件全部定義爲相同的名稱'static',則什麼都不會發生,'static'使得名稱具有文件範圍(即在別處不可見)。 – vonbrand 2013-03-05 20:05:41

+0

@ vonbrand:假設聲明瞭不同的函數,你會得到一個錯誤的聲明錯誤。除非我猜測所有相同的函數名稱都是以完全相同的方式定義的。 – teppic 2013-03-05 20:08:04

+0

請嘗試。你會發現''a.c'中的'static double foo(double)'完全獨立於'b.c'中的'static int foo'和'c.c'中的'static unsigned long foo(int,char *)'。如果沒有,你的C堆棧被破壞得很大,得到一個體面的操作系統。 – vonbrand 2013-03-05 20:14:34

0

你的問題的解決方案是定義一些前綴爲您的庫,例如ouah_並給出以它爲前綴的所有函數/變量名稱,除非您可以使它們成爲static(即僅在它們被定義的文件中可見)。不,它不會確保沒有名稱衝突,但它應該減少很多。像背後的原因道格Gwin的Q8 ......

這BTW是在C++ behing的namespace事情的原因,也有一部分要歸咎於OOP和它的「方法」 /「成員函數」屬於「類」

相關問題