2016-01-13 21 views
1

我已經將工作環境從Ubuntu 12.04升級到14.04。 這導致我的編譯器clang3.0-6ubuntu3升級到3.4-1ubuntu3C++:錯誤:基類有一個靈活的陣列成員

當我編譯我的代碼現在我得到一個錯誤,我沒有用得到:

error: base class has a flexible array member 

我跟着代碼,我發現我使用inotify.h

#include <sys/inotify.h> 

在這個文件中就在於這個結構:

struct inotify_event { 
    int  wd;  /* watch descriptor */ 
    uint32_t  mask;  /* watch mask */ 
    uint32_t  cookie;  /* cookie to synchronize two events */ 
    uint32_t  len;  /* length (including nulls) of name */ 
    char  name __flexarr; /* stub for possible name */ 
}; 

接下來,我看了一下__flexarrhere但我沒有設法弄清楚什麼地方出了問題,或者我該如何解決它。 任何幫助將不勝感激。


更新:作爲BobTFish答案的後續,這裏是在我的代碼中使用inotify_event。

我有一個名爲inotify_condition_c的類,它有一個inotify_event類型的成員,我們稱之爲m_notify_event

我有幾個類從inotify_condition_c繼承。 編譯錯誤clang返回指向那些派生類。

這不是一個新的鱈魚,它在我們的回購很長一段時間。我仍然不明白爲什麼從ubuntu 12.04升級到14.04(還有新版本的clang)顯示錯誤。

回答

5

__flexarr是C把戲,你把一個空數組在struct結束,然後將你馬上需要的數據struct的實例後,這樣你就可以像對待的陣列的一部分的額外數據。因此,對於inotify_event

|wd|mask|cookie|len|name|some|extra|data| 
         ^^^^^^^^^^^^^^^ can be accessed with name[0], name[1], etc. 

當你從另外一個類繼承:

struct Base { 
    int a; 
}; 
struct Derived : Base { 
    int b; 
} 

會(通常)在內存佈局,從而爲Derived數據緊跟在數據Base|a|b|

應該清楚的是,這兩種技術是不兼容的。因此,當你嘗試使用靈活的數組從類中派生出來時,看起來clang已經引入了錯誤,例如inotify_event

在代碼中的某處,某些內容從inotify_event繼承。你不能那樣做。

但是,直到我們看到那個類,我們不能建議如何解決它。如果你能找到那個班級,把它編輯成你的問題,並解釋它是如何使用的,我們可能會進一步提供幫助。

編輯:
最壞的(即,不涉及某種程度的UB)解決方案我能想到的是,我的頭頂上是以外的類,通過動態分配它。將std::unique_ptr<inotify_event>成員存儲在您的班級中,並使用std::make_unique<inotify_event>()進行設置。然後把它看作一個普通的指針,但不要擔心new/delete

所以需要額外的撥款,但其他解決方案,我能想到的涉及啞類,看起來幾乎inotify_event,和一個非常可疑的演員。

另一種可能性是存儲重建inotify_event所需的數據,並在每次需要時在本地創建一個新數據。我不知道在你的情況下,終生問題是否會允許。

+0

謝謝。查看我的更新。 –

+0

@AndyThomas我加了一些想法。儘管沒有明確的解決方案,這取決於你,因爲只有你真的瞭解你的代碼庫。 – BoBTFish

相關問題