我們有一個很大的舊C++應用程序,其中包含大量遺留代碼和一些用C語言編寫的外部庫。這些庫很少更新 - 只有當我們發現一個錯誤和供應商提供補丁。這發生在上週的一個圖書館,並在整合新版本後,我們發現如果我們不在本地修改圖書館(我們顯然是用最後一個版本做的),我們的版本會打破這個錯誤信息:在C++中處理C庫匿名結構類型
non-local function ‘static E* MyCls::myFct(<anonymous struct>*)’ uses anonymous type
這是由於圖書館宣佈了一些手柄類型是這樣的:
#define _Opaque struct {unsigned long x;} *
typedef _Opaque Handle;
typedef _Opaque Request;
這是我們在一些班函數簽名就在我們身邊使用:
class MyCls {
public:
static void* myFct(Handle handle);
...
}
由於_Opaque結構沒有名稱,編譯器無法爲函數創建合適的名稱 - 名稱,這會產生上述錯誤。
我們對這個當前的解決方法是打補丁庫的頭文件,明確給予結構的名稱:
//#define _Opaque struct {unsigned long x;} * //Replaced by typedef below!
typedef struct __Opaque {unsigned long x;} * _Opaque;
這顯然是不好的,因爲我們不希望儘可能地接觸到庫中。另一個更糟糕的選擇是將所有函數簽名中的類型轉換爲void*
並將它們轉換回它們各自的類型。並且有最壞的選擇來重寫純C中的每個受影響的函數...
所以,我的問題是:是否有比修補庫更好的選項?我忽略了一個簡單的解決方案嗎?解決這個問題的最好方法是什麼?
看不到這與C有什麼關係。你的問題是C++包裝器的名稱改變,不是? – 2012-08-13 12:11:36
這可能是升級到C++ 11的一個很好的參數,它沒有這個限制。 – ecatmur 2012-08-13 12:13:10
@JensGustedt,是正確的,但我也將它標記爲C,因爲庫是用C語言編寫的,從技術上講它是C/C++互操作性問題。 – l4mpi 2012-08-13 12:19:47