我知道如果沒有找到該函數的原型,將會產生編譯器錯誤。但是讓我說我知道一個庫包含一些非公共函數,並且我爲它創建了自己的原型(匹配靜態庫中的一個),鏈接器是否能夠將其拉入?函數是否在靜態庫中,不在頭中公開,可訪問?
我問的原因是我創建了一個庫,我在這裏爲函數使用通用通用名稱,比如「init()」,它們只用於內部使用。我不知道他們是否會連接
我知道如果沒有找到該函數的原型,將會產生編譯器錯誤。但是讓我說我知道一個庫包含一些非公共函數,並且我爲它創建了自己的原型(匹配靜態庫中的一個),鏈接器是否能夠將其拉入?函數是否在靜態庫中,不在頭中公開,可訪問?
我問的原因是我創建了一個庫,我在這裏爲函數使用通用通用名稱,比如「init()」,它們只用於內部使用。我不知道他們是否會連接
其在與庫之外的符號碰撞依賴於功能的聯動:
//.c file
// external linkage, accessible from outside using the right prototype
void foo(void) {}
// internal linkage, not accessible from outside
static void bar(void) {}
原型是編譯器,而不是連接器的好處。編譯器會高興地編譯你聲明的任何函數的代碼,但如果你試圖使用在另一個文件或庫中定義爲靜態的函數,你會得到一個鏈接器錯誤。
如果不能在文件之外使用,則可以並且應該將自己的函數聲明爲靜態函數。但是,如果您隨後使用其他包含具有相同函數名稱的聲明的代碼進行編譯,則會發生衝突,除非它們的定義完全相同。例如,如果您將init
函數定義爲靜態函數,則只能在該文件中直接使用它;但是如果你包含任何聲明另一個函數的頭文件,名稱爲init
,你會得到一個錯誤。
(可以訪問在另一個文件中的靜態功能,但它需要的指針。)
如果您將幾個文件全部定義爲相同的名稱'static',則什麼都不會發生,'static'使得名稱具有文件範圍(即在別處不可見)。 – vonbrand 2013-03-05 20:05:41
@ vonbrand:假設聲明瞭不同的函數,你會得到一個錯誤的聲明錯誤。除非我猜測所有相同的函數名稱都是以完全相同的方式定義的。 – teppic 2013-03-05 20:08:04
請嘗試。你會發現''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
你的問題的解決方案是定義一些前綴爲您的庫,例如ouah_
並給出以它爲前綴的所有函數/變量名稱,除非您可以使它們成爲static
(即僅在它們被定義的文件中可見)。不,它不會確保沒有名稱衝突,但它應該減少很多。像背後的原因道格Gwin的Q8 ......
這BTW是在C++ behing的namespace
事情的原因,也有一部分要歸咎於OOP和它的「方法」 /「成員函數」屬於「類」
謝謝。如果我在一個文件中只有一個文件中有一個函數,那麼我只能通過另一個文件訪問它,但除此之外別無它法。處理這個問題的最好方法是什麼? – 2013-03-05 19:35:43
@BrandonYates您不能在C中執行此操作。 – ouah 2013-03-05 19:40:35