從C 呼叫C 函數:導航名稱修改
使用混合語言應用程式時,從C 內部呼叫C 函數的挑戰由於C的名稱損壞而出現。與使用簡單函數名稱的 C 不同,C 採用複雜的命名方案來解析重載函數和類,從而導致不同的函數簽章。在嘗試解析未解析的符號時,這可能會導致連結器錯誤。
在這種情況下,解決方法包括建立一個提供對 C 功能的存取的 C API。這需要編寫聲明為 extern "C" 的 C 程式碼並遵守純 C 語法,避免類別等物件導向的功能。隨後,建立一個 C 包裝庫來公開 C 庫的功能。
例如,考慮以下C API:
#ifdef __cplusplus #define EXTERNC extern "C" #else #define EXTERNC #endif typedef void* mylibrary_mytype_t; EXTERNC mylibrary_mytype_t mylibrary_mytype_init(); EXTERNC void mylibrary_mytype_destroy(mylibrary_mytype_t mytype); EXTERNC void mylibrary_mytype_doit(mylibrary_mytype_t self, int param); #undef EXTERNC
對應的C 實作如下:
mylibrary_mytype_t mylibrary_mytype_init() { return new MyType; } void mylibrary_mytype_destroy(mylibrary_mytype_t untyped_ptr) { MyType* typed_ptr = static_cast<MyType*>(untyped_ptr); delete typed_ptr; } void mylibrary_mytype_doit(mylibrary_mytype_t untyped_self, int param) { MyType* typed_self = static_cast<MyType*>(untyped_self); typed_self->doIt(param); }
這種方法可讓您從C 程式碼存取C 功能,同時減輕名稱修改問題。
以上是如何從 C 程式碼呼叫 C 函數並避免名稱修改問題?的詳細內容。更多資訊請關注PHP中文網其他相關文章!