2013-10-04 45 views
7

我在C一些現有的代碼:在一個恆定結構字符數組的靜態初始化從C到C++

extern const struct sockaddr_un addr = 
{ 
    .sun_family = AF_UNIX, 
    .sun_path = "myreallylongpath" 
}; 

凡sun_path是一個字符陣列。

這個在舊版本的GCC中用於編譯爲C語言。我現在已經將它轉換爲C++並使用GCC v4.7.2。我不斷收到錯誤:

"C99 designator 'sun_path' outside aggregate intializer"

是不可能做我在C++中做的事情,或者是不同於舊的C語法?

+1

如果您在整個代碼轉換爲C++,考慮增加一個構造函數來sockaddr_un並用它來創建實例。 –

+0

@NeilKirk:這是一個來自標準POSIX C API的結構。你不能向它添加構造函數(好的,你可以添加一個命名構造函數,但我認爲它沒有多大意義)。 –

回答

11

在C99中引入了指定的初始值設定項,GCC也支持它們作爲GNU89的擴展,但不支持C++。

所以你需要使用C89風格,C++也支持這種風格。由於結構只具有這兩個領域:

extern const struct sockaddr_un addr = 
{ 
    AF_UNIX, 
    "myreallylongpath" 
}; 

參考:Designated Initializers

+0

所以缺點是如果該庫結構發生變化,我們會在錯誤的地方得到錯誤的數據。請注意,如果他們改變了這個定義,反正它可能會「打破世界」。 :-P – Joe

+2

@Joe:這是POSIX規範的標準接口。它在40年左右沒有變化,沒有讓天空掉下來就無法改變。在這種特殊情況下,我絕對不會爲此擔心。 –