Как проверить, является ли указатель в C определенного типа? - PullRequest
13 голосов
/ 04 июня 2009

Как проверить, относится ли указатель к определенному типу?

Использование sizeof недостаточно.

Я стараюсь избегать ввода идентификационных номеров в мои структуры, чтобы определить их тип. Предполагается, что, возможно, gcc помещает определение структуры где-то в процессе и отображает определение в выделенную память по указателю. Если это правда, я бы подумал, что можно было бы проверить тип указателей.

Ответы [ 11 ]

0 голосов
/ 04 июня 2009

Стандарт C не допускает этого напрямую. Стандарт C ++ имеет некоторые возможности для этого (dynamic_cast и typeid).

typeof

GCC поставляется с оператором typeof , который может быть полезен в зависимости от того, что вы делаете.

условный оператор

Условный оператор (знак вопроса и двоеточие в выражениях, подобных x = y == 0 ? 1 : 0;) имеет некоторую возможность сказать, можно ли привести два типа к третьему типу (эта статья о C ++, но Тип безопасности условного оператора такой же в с). Его использование неочевидно, если не сказать больше.

Оба эти метода (typeof и условный оператор) ограничены тем, какая информация доступна во время компиляции. То есть вы не можете передать void* в функцию, а затем использовать typeof, чтобы выяснить исходный тип объекта, на который указывает указатель внутри этой функции (потому что такая информация недоступна внутри этой функции при компиляции время).


Подумав об этом больше, GTK + написан на C, а имеет систему , которую вы можете подумать об эмуляции. Похоже, они используют идентификаторы типов, но вместо того, чтобы помещать идентификаторы в структуру, они используют макросы для поиска.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...