我相信源文件中的靜態函數不能直接從文件外調用。但是,如果我以某種方式設法將此函數的指針轉換爲另一個文件,那麼我可以從該文件調用此函數。如果是的話,是否有任何情況下我們想採取這種路線,而不是簡單地使該功能非靜態?可以通過C中的函數指針調用靜態函數嗎?
回答
是的,你可以通過發出指向它們的靜態函數。這是在C語言中實現Factory pattern的常用方法,您可以在其中隱藏使用它們的模塊中的一大堆函數的實現,並且有一個FuncPtr_t GetFunction(enum whichFunctionIWant)
將它們傳遞給消費者。這就是多少個dynamic linking實現的工作。
是的,文件中的非靜態函數可以將指向靜態函數的指針返回到任何你喜歡的位置。
但是,如果我設法得到一個指向這個函數的指針到 另一個文件,我可以從那個文件中調用這個函數。
是的,這是完全可能的。該函數對鏈接器不可見,但它在可執行文件中。你總是可以跳轉到它的地址。
雖然我不確定情況。也許你想讓其他人只在之後調用你的函數他們調用了一些其他函數(當然是非靜態的)。所以你有他們它獲得它,然後他們可以打電話給它。
是的,你可以。如果您必須調用一個函數,該函數將函數的指針視爲回調函數,則可以使用static,以便函數符號不會污染全局名稱空間,並且不會導致鏈接器衝突。最常用的例子可能是qsort:
struct Data { ... };
static int compareData(const void* a, const void* b) { /* cast to Data and compare */ }
...
qsort(array, count, sizeof(Data), &compareData);
正如另一個提到的,你可以做到這一點。爲什麼你可能想要某種「驅動程序」的例子。您可以傳回包含開放,關閉,讀取和寫入功能的結構,而無需公開實際的功能。
是的,你可以,你總是可以自己嘗試,並找出:
file1.c中
#include <stdio.h>
void call_hello(void (*fptr)(void));
static void hello(void) {
puts("hello");
}
int main(void)
{
void (*fptr)(void) = hello;
call_hello(fptr);
return 0;
}
file2.c中
void call_hello(void (*fptr)(void))
{
fptr();
}
這在C中通常不是一個好方法。「它有效」和「它是安全的,可以在任何地方工作,並且不依賴於未定義的行爲」通常是非常不同的事情。 –
它往往是用於定義一個小的靜態函數作爲另一個工作者函數。看一下標準qsort
的例子:它需要一個比較函數,而且通常最好是將該比較函數設置爲靜態的(例如,因爲它在其他地方沒有用處,並且因爲qsort
希望它具有一些無害的簽名)。
- 1. 通過函數指針靜態調用虛函數
- 2. C++調用靜態函數指針
- 3. 通過函數指針使用的函數可以內聯嗎?
- 4. C++通過函數指針調用函數中的矢量
- 5. C++通過函數指針指向另一個函數指針
- 6. C - 通過函數動態數組寫指針,指針
- 7. 通過非靜態成員函數指針在C++
- 8. 通用指針調用C函數
- 9. C++調用函數指針
- 10. 無法通過靜態方法調用指向成員函數的指針
- 11. C - 不帶函數指針的動態函數調用
- 12. 如何通過函數指針和參數在C++中調用函數
- 13. 如何通過此函數的指針調用winapi函數?
- 14. C++:通過基類中定義的函數指針派生函數調用
- 15. C++通過main函數中的類函數傳遞指針
- 16. 如何從靜態成員函數調用指向成員函數的指針?
- 17. C++函數指針和回調函數
- 18. 通過函數指針重載函數
- 19. 靜態模板函數可以通過編譯器內聯嗎?
- 20. c函數指針反函數指針
- 21. 函數指向非靜態成員函數的指針?
- 22. 現有的靜態方法可以使用函數指針進行全局嗎?
- 23. 如何通過成員函數指針調用成員函數?
- 24. 靜態函數調用非靜態函數在C++
- 25. 函數指針的靜態映射
- 26. 如何通過函數指針調用具有不同簽名的C++函數
- 27. C++模板函數跳過一個靜態函數調用
- 28. C - 通過函數調用迷路的雙指針
- 29. 函數指針指向非靜態函數
- 30. 將指針轉換爲成員函數指向靜態函數
我想知道如果你將這與'inline'關鍵字和/或專有的編譯器指令混合使用,它總是內聯一個函數,那麼行爲是什麼。 – mpontillo
@mpontillo我相信,即使函數被標記爲「inline」,但地址是在函數指針中取得的,編譯器會在二進制文件中生成主體,同時也將其內聯到同一模塊中的其他函數中。 –