我有許多結構,其具有第一3個字段常見的,下面是 簡化的示例:通用API來初始化結構與共用字段
struct my_struct1 {
/* common fields. */
int a;
int b;
int c;
};
struct my_struct2 {
int a;
int b;
int c;
uint32_t d;
uint32_t e;
};
struct my_struct3 {
int a;
int b;
int c;
uint16_t d;
char e;
};
static void func1(struct my_struct1 *s)
{
/* ... */
}
static void func2(struct my_struct2 *s)
{
/* ... */
}
static void func3(struct my_struct3 *s)
{
/* ... */
}
int main(void)
{
struct my_struct1 s = {1, 2, 3};
struct my_struct2 p = {1, 2, 3, 4, 5};
struct my_struct3 q = {1, 2, 3, 4, 'a'};
func1(&s);
func2(&p);
func3(&q);
/* XXX */
func3((struct my_struct3 *)&s);
return 0;
}
它是安全的類型轉換s
到struct my_struct3 *
並傳遞給func3
並確保s
或堆棧上分配的其他對象不會被破壞?
原因是我想編寫一個通用API,它需要一個指針,初始化通用字段(這是通用的結構)。另一個功能是特定於my_struct*
並設置其餘的字段。
我不確定void *
是否可以解決這個問題。
UPDATE 我應該指出,很遺憾,我不能改變的結構佈局,即增加公共部分是不是一種選擇,因爲我正在使用的代碼是很老,我不允許改變其核心結構。
唯一的解決辦法醜,我看到的是通過void *
和enum struct_type
參數generic_init
功能,以及基於struct_type
投void *
適當的結構。
不,這是*不允許的。但是,爲什麼不把通用部分放入一個結構中,然後將其用作其他結構的第一個成員?然後,您可以將指針轉換爲其中一個派生結構的指針,以指向基礎結構。 – EOF
只需將「常用字段」移動到另一個子結構中並使其成爲其他字段。然後將該字段傳遞給初始化函數 –