首頁 >後端開發 >C++ >如何從 C 程式碼呼叫 C 函數並避免名稱修改問題?

如何從 C 程式碼呼叫 C 函數並避免名稱修改問題?

Mary-Kate Olsen
Mary-Kate Olsen原創
2024-12-25 01:58:13861瀏覽

How Can I Call C   Functions from C Code and Avoid Name Mangling Issues?

從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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn