Скажите, что функция берет пустой указатель в качестве аргумента, как так: int func(void *p);
Как мы можем определить или предположить тип того, на что указывает p?
В общем, нельзя. В некоторых случаях, если есть гарантия на то, на что указывает p, вы можете посмотреть содержимое по этому адресу и после него, чтобы узнать. Как правило, ваша функция должна знать, что ей передается, если только она не передает это просто.
Аргументы данных и функций в C - это просто набор битов, собранных вместе. Если вы не используете некоторые из этих битов, чтобы сказать вам, что это за биты, не существует последовательного способа их идентифицировать.
Короткий ответ - нельзя.
В C нет информации о времени выполнения , если вы не предоставите ее , но посмотрите на семейство printf (3)
и посмотрите, как легко выстрелить себе в ногу с несоответствующим спецификация формата и фактический тип аргумента.
Система типов - ваш друг. Используй это.
Конечно можете, и это тоже просто. Это C, делайте что хотите и как хотите.
Сделайте систему типов. Поместите все, что вы передаете, в структуру, сделайте первый байт или два магическим числом, чтобы определить, что структура содержит дальше магического числа.
Сделайте несколько функций для создания/получения/установки/уничтожения "типизированных переменных".
Сделайте несколько других функций для добавления и регистрации новых типов во время выполнения.
Создайте несколько определений, чтобы облегчить чтение и типизацию структур.
Не успеете вы оглянуться, как у вас будет отличная собственная система типов, которую вы сможете использовать в своих проектах, и она всегда будет делать ТОЧНО то, что вы хотите и что вам нужно, потому что вы ее создали.
Вы можете сойти с ума и развить ее до полноценной объектно-ориентированной системы. Или избавить себя от работы, и использовать работу всех других людей, которые уже сошли с ума - http://en.wikipedia.org/wiki/GObject