Ближайшим приближением в C99 (но не в C89) является наличие гибкого элемента массива в конце структуры:
struct Var_Members_Interface
{
int intMember;
char *charMember;
Type flexArrayMember[];
};
Теперь вы можете динамически распределять структуру с помощью массива типа Type
в конце и получите доступ к массиву:
struct Var_Members_Interface *vmi = malloc(sizeof(*vmi) + N * sizeof(Type));
vmi->flexArrayMember[i] = ...;
Обратите внимание, что это не может быть использовано в C ++.
Но это не очень близко к тому, что вы ищете.То, что вам нужно, не может быть выполнено в C с одним типом структуры и может быть аппроксимировано в C ++ только через наследование - см. Другие ответы.
Один трюк, с которым вы можете справиться - обычно - вC использует несколько типов структур и множество приведений:
struct VM_Base
{
int intMember;
char *charMember;
};
struct VM_Variant1
{
int intMember;
char *charMember;
int intArray[3];
};
struct VM_Variant2
{
int intMember;
char *charMember;
Type typeMember;
};
struct VM_Variant3
{
int intMember;
char *charMember;
double doubleMember;
};
Теперь, с некоторыми бросками кувалдой, вы можете написать функции, которые принимают аргументы 'struct VM_Base *
' и передают указатель на любой из VM_VariantN
типы.'intMember
', вероятно, может использоваться, чтобы сказать, какой из вариантов у вас есть на самом деле.Это более или менее то, что происходит с функциями сокетов POSIX.Существуют разные типы адресов сокетов, и структуры имеют разную длину, но они имеют общий префикс, и в результате вызывается правильный код, поскольку общий префикс идентифицирует тип адреса сокета.(Дизайн не элегантный, но он был стандартом - де-факто стандартом для сокетов BSD - до того, как POSIX его стандартизировал. И дизайн BSD предшествовал C89, не говоря уже о C99. Он разрабатывался сейчас с нуля, без каких-либо требованийдля совместимости с существующим кодом это было бы сделано по-другому.)
Эта техника безобразна, как грех, и требует большого количества приведения для ее компиляции - и очень старается, чтобы она работала правильно.Вы не должны беспокоиться о таком беспорядке в C ++.