Вы не можете, потому что динамические типы данных не существуют в общем в C . Проверьте, прочитав стандарт C11 n1570 .
Что вы можете сделать, это реализовать какой-нибудь тегированный тип объединения и составить список, содержащий их (или, возможно, список, содержащий некоторые указатели , но вам нужно решить, о некоторых стратегиях управления памятью и соответствующих соглашениях о кодировании).
Как реализовать такие типы теговых объединений - это другой вопрос. Для вдохновения посмотрите на тип Glib GVariant (но есть и другие способы сделать это; один пример - тип значения Python, подробнее об этом читайте в главе расширение Python ; или в некоторых struct
содержащие union
или union
из struct
, все начинающиеся с общего различающего поля, или union
указателей на такие struct
и т. д.), и изучите исходный код этой реализации в Glib, который является свободным программным обеспечением .
Вы могли бы также рассмотреть некоторый метапрограммирующий подход , например. генерировать некоторый C-код из некоторого описания ваших типов данных. Посмотрите на SWIG или RPCGEN для вдохновения.
Кстати, библиотека заголовков SGLIB , в основном использующая многие препроцессоры (с огромными макросами C) для предоставления "универсальных" контейнеров.
Помните также о ABI и соглашениях о вызовах вашей реализации на C. В некоторых случаях это может помочь понять его (например, если вы решите использовать теговые указатели ). Обратите внимание, что многие базовые типы C (int
, long
, char
, указатели на данные , указатели на функции ) имеют существенно разные представления (разные размеры, разные выравнивания , различные способы передачи в качестве аргументов и возврата в качестве результатов - например, в различных регистрах процессора или в стеке вызовов ) и, возможно, даже в разных адресных пространствах (вспомните Гарвардскую архитектуру , где указатели функций находятся в другом пространстве, чем данные, и могут иметь размеры, отличные от указателей данных).