C: Экстраполирование типа от пустого указателя

Скажите, что функция берет пустой указатель в качестве аргумента, как так: int func(void *p);
Как мы можем определить или предположить тип того, на что указывает p?

13
задан Yktula 9 April 2010 в 02:56
поделиться

3 ответа

В общем, нельзя. В некоторых случаях, если есть гарантия на то, на что указывает p, вы можете посмотреть содержимое по этому адресу и после него, чтобы узнать. Как правило, ваша функция должна знать, что ей передается, если только она не передает это просто.

Аргументы данных и функций в C - это просто набор битов, собранных вместе. Если вы не используете некоторые из этих битов, чтобы сказать вам, что это за биты, не существует последовательного способа их идентифицировать.

25
ответ дан 1 December 2019 в 19:07
поделиться
​​

Короткий ответ - нельзя.

В C нет информации о времени выполнения , если вы не предоставите ее , но посмотрите на семейство printf (3) и посмотрите, как легко выстрелить себе в ногу с несоответствующим спецификация формата и фактический тип аргумента.

Система типов - ваш друг. Используй это.

6
ответ дан 1 December 2019 в 19:07
поделиться

Конечно можете, и это тоже просто. Это C, делайте что хотите и как хотите.

Сделайте систему типов. Поместите все, что вы передаете, в структуру, сделайте первый байт или два магическим числом, чтобы определить, что структура содержит дальше магического числа.

Сделайте несколько функций для создания/получения/установки/уничтожения "типизированных переменных".

Сделайте несколько других функций для добавления и регистрации новых типов во время выполнения.

Создайте несколько определений, чтобы облегчить чтение и типизацию структур.

Не успеете вы оглянуться, как у вас будет отличная собственная система типов, которую вы сможете использовать в своих проектах, и она всегда будет делать ТОЧНО то, что вы хотите и что вам нужно, потому что вы ее создали.

Вы можете сойти с ума и развить ее до полноценной объектно-ориентированной системы. Или избавить себя от работы, и использовать работу всех других людей, которые уже сошли с ума - http://en.wikipedia.org/wiki/GObject

7
ответ дан 1 December 2019 в 19:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: