2011-02-10 52 views

回答

6

它可以做你想做的事情,但是爲什麼你會避免使用extern,當它正是你想通過一個更復雜的(和不可讀的)機制來模擬?

1

C中的靜態聲明告訴編譯器不要添加函數符號表。這意味着如果其他模塊需要,提供者無法鏈接該功能。該函數仍然存在(但對鏈接器不可見),因此如果將函數的地址記錄在指針中,則可以毫無問題地調用該函數。

所以簡短的回答是肯定的,沒關係。

+1

...或者你可以用一個公共名稱編寫一個額外的函數,它只是簡單地調用靜態函數來完成這項工作,但爲什麼不把原始函數放在第一位呢? – 2011-02-10 21:12:16

0

是的,在隱藏實現時製作公共指針通常是您可能期望的工廠樣式模式。

知道自己爲什麼說「我想全局使用它而不將其重新聲明爲作爲extern」可能很有趣。
爲什麼要將聲明從static(僅在該模塊中可用)更改爲extern(使其在模塊外部可用並將其發佈)您想要避免的操作?

0

如果它在全局名稱空間中的cpp文件中是靜態的,那麼該函數只能從該cpp文件中直接使用。它是一種私人幫手功能。

你可以做的是在函數原型上做一個typedef,並引入一個公共函數,該函數返回一個函數指針或一個指向不同函數的指針表,這通常是爲了實現插件和有一些回調或API方法註冊。 +要點是你沒有強大的綁定功能。

0

靜態說明符隱含內部鏈接。

您希望使用外部鏈接的靜態,而不需要顯式存儲說明符。如果你的函數在命名空間範圍內,只需刪除'static'說明符。命名空間範圍的默認行爲在外部鏈接時是靜態的。

相關問題