Стандарт C не допускает этого напрямую. Стандарт C ++ имеет некоторые возможности для этого (dynamic_cast
и typeid
).
typeof
GCC поставляется с оператором typeof , который может быть полезен в зависимости от того, что вы делаете.
условный оператор
Условный оператор (знак вопроса и двоеточие в выражениях, подобных x = y == 0 ? 1 : 0;
) имеет некоторую возможность сказать, можно ли привести два типа к третьему типу (эта статья о C ++, но Тип безопасности условного оператора такой же в с). Его использование неочевидно, если не сказать больше.
Оба эти метода (typeof
и условный оператор) ограничены тем, какая информация доступна во время компиляции. То есть вы не можете передать void*
в функцию, а затем использовать typeof
, чтобы выяснить исходный тип объекта, на который указывает указатель внутри этой функции (потому что такая информация недоступна внутри этой функции при компиляции время).
Подумав об этом больше, GTK + написан на C, а имеет систему , которую вы можете подумать об эмуляции. Похоже, они используют идентификаторы типов, но вместо того, чтобы помещать идентификаторы в структуру, они используют макросы для поиска.