我使用嵌套結構,以創造一種以純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
,然後轉換爲相應的結構來確定各種對象的結構。我的問題是,我希望能夠初始化這些「子」結構,而無需手動定義父結構的x
和y
屬性。
基本上,我可以初始化這樣的指針:
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));
有什麼辦法來創造一種「匿名」數據塊傳遞給函數?或者我會不得不採取像宏這樣的工作來完成這項工作?
不是,但我想你可能是在尋找C++ 11的初始化列表。 – Mehrdad
@Mehrdad,這是一個不是C++的C問題。 –
除了H2CO3在他的回答中顯示的複合文字之外,您還可以查看*指定的初始化符*,例如'{.toto = 42}'。你也可以根據你的'struct'的嵌套結構來更好地構造初始化器。 –