Одна функция, обрабатывающая все три типа, не будет работать, потому что размеры и типы каждого члена различны, даже если имена совпадают.
Например, сохранение значения 1 в data
поле каждого выглядит следующим образом, принимая во внимание порядок байтов с прямым порядком байтов и представление одинарной точности IEEE 754 для float
:
a.data
---------------------
| 00 | 00 | 00 | 01 |
---------------------
b.data
------
| 01 |
------
c.data
---------------------
| 3f | 80 | 00 | 00 |
---------------------
Так что, не зная ничего о действительном типе, нет способа сделать именно то, что выищу.
Самое близкое к чему вы хотите - это создать функцию для каждого типа, а затем использовать макрос с _Generic
для переноса того, какой из них вызывается.
void func_s1(s1 *p)
{
...
}
void func_s2(s2 *p)
{
...
}
void func_s3(s3 *p)
{
...
}
#define func(p) _Generic((p), \
s1: func_s1, \
s2: func_s2, \
s3: func_s3)(&p)