2012-12-31 23 views
0

我使用嵌套結構,以創造一種以純C.「結構繼承」舉個例子,我有幾個結構是這樣的:是否可以在C99中創建一個「匿名」初始值設定項?

struct a { 
    obj_type type_id; 
    int x; 
    int y; 
} 

struct b { 
    struct a super; 
    char* str; 
} 

struct c { 
    struct a super; 
    int* data; 
    bool flag; 
} 

我然後創建一個枚舉,像這樣:

typedef enum { 
    OBJ_TYPE_A, 
    OBJ_TYPE_B, 
    OBJ_TYPE_C 
} obj_type; 

這讓我模擬繼承,通過檢查他們的type_id,然後轉換爲相應的結構來確定各種對象的結構。我的問題是,我希望能夠初始化這些「子」結構,而無需手動定義父結構的xy屬性。

基本上,我可以初始化這樣的指針:

struct b obj_b = { OBJ_TYPE_B, 0, 0, "foo" }; 
struct b *ptr_b = malloc(sizeof(struct b)); 
memcpy(ptr_b, &obj_b, sizeof(struct b)); 

不過,我寧願有一個函數來做到的a初始化對我來說,這樣我就可以做這樣的事情:

struct b *ptr_b = object_create(OBJ_TYPE_B, { "foo" }, sizeof(struct b)); 

我創建類似像這樣的功能的實現:

const struct a DEFAULT_A = { OBJ_TYPE_A, 0, 0 }; 

struct a object_create(obj_type type, void* data_ptr, size_t size) { 
    struct a new_obj = malloc(size); 
    memcpy(new_obj, &DEFAULT_A, sizeof(struct a)); 
    memcpy(new_obj + sizeof(struct a), data_ptr, size - sizeof(struct a)); 
    return new_obj; 
} 

不過,我真的不能用這個,因爲我沒有做這樣的方式:

struct b *ptr_b = object_create(OBJ_TYPE_B, &{ "foo" }, sizeof(struct b)); 

有什麼辦法來創造一種「匿名」數據塊傳遞給函數?或者我會不得不採取像宏這樣的工作來完成這項工作?

+0

不是,但我想你可能是在尋找C++ 11的初始化列表。 – Mehrdad

+0

@Mehrdad,這是一個不是C++的C問題。 –

+0

除了H2CO3在他的回答中顯示的複合文字之外,您還可以查看*指定的初始化符*,例如'{.toto = 42}'。你也可以根據你的'struct'的嵌套結構來更好地構造初始化器。 –

回答

3

你想要的是在C99中的確是可能的。例如上述的作品,你就必須拋棄的結構字面:

#include <stdio.h> 

struct s { 
    char *a; 
}; 

void f(struct s *p) 
{ 
    printf("%s\n", p->a); 
} 


int main() 
{ 
    f(&(struct s){ "hello world" }); 
    return 0; 
} 

更多的話題this article

複合文字產生左值。這意味着您可以獲取複合文字的地址,複合文字是複合文字聲明的未命名對象的地址。只要複合文字不具有const限定類型,您可以使用指針對其進行修改。

+0

所以,爲了確認,我必須創建一個輔助結構,它只包含我的「孩子」結構所特有的屬性,並將其轉換爲該結構? –

+0

@JakeKing是的,類似的東西。 – 2012-12-31 20:16:38

相關問題