2012-08-25 36 views
3

通常,爲了初始化c中的struct,我們只能指定部分字段。如下圖所示:如何在使用g ++編譯器時使用c風格初始化一個結構體?

static struct fuse_operations hello_oper = { 
    .getattr = hello_getattr, 
    .readdir = hello_readdir, 
    .open  = hello_open, 
    .read  = hello_read, 
}; 

然而,在C++中,我們應初始化在struct變量不點名的字段。 現在,如果我想在使用g ++編譯器時使用c樣式初始化struct,該怎麼做? PS:我需要這樣做的原因是struct fuse_operations有太多的領域。

回答

1

不幸的是,即使C99的C++標準lacks the designated initializers feature的C++ 11版本也是如此。

+0

難道不可以使用extern c作爲工作嗎? – MimiEAM

+0

@MimiEAM您需要將代碼放在C文件中,並使用基本上不同的編譯器進行編譯,即使它來自同一製造商。我肯定會避免這種情況。 – dasblinkenlight

+0

所以這是一個不好的做法?因爲它被廣泛使用 – MimiEAM

0

也許你可以編寫一個變量參數函數,它將函數指針作爲輸入,並將其餘的attribs賦值爲NULL。由於您只有一個struct - fuse_operations,因此只能爲一個結構實現該功能。像init_struct(int no_op,...),其中您將函數指針傳遞給實現。它過於複雜和艱苦的,但我想你可以寫一次,並一直使用它...

5

您寫道:

static struct fuse_operations hello_oper = { 
     .getattr = hello_getattr, 
     .readdir = hello_readdir, 
     .open  = hello_open, 
     .read  = hello_read, 
    }; 

一般來說,爲了初始化在C結構,我們只能指定部分字段[...]但是,在C++中,我們應該初始化結構中的變量,而不用命名字段。現在,如果我想在使用g ++編譯器時初始化一個使用c風格的結構 ,該怎麼做? PS:我需要這樣做 的原因是結構fuse_operations中有太多的字段。

我的解決辦法是使用構造專門的結構:

struct hello_fuse_operations:fuse_operations 
{ 
    hello_fuse_operations() 
    { 
     getattr = hello_getattr; 
     readdir = hello_readdir; 
     open  = hello_open; 
     read  = hello_read; 
    } 
} 

然後宣佈新結構的靜態實例:

static struct hello_fuse_operations hello_oper; 

測試工作確定爲我(但這個要看C結構和C++結構的內存佈局是一樣的 - 不確定這是保證)

*更新*

雖然這種方法在實踐中運行良好,但後來我將代碼轉換爲使用實用類,即具有單個靜態「初始化」方法的類,該方法引用fuse_operation結構並初始化它。這避免了關於內存佈局的任何可能的不確定性,並且將是我一般推薦的方法。

相關問題