Как проверить тип в макросе C

Я думал о способах проверки типов в макросах C, и пока что лучший способ, который я придумал, таков:

#define ASSERT_PTYPE(TYPE, VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE))

Это, очевидно, ожидает тип имя и указатель на этот тип. Аналогичный макрос ASSERT_TYPE также может быть создан. Кажется, это неплохо работает с GCC. Он даже дает очень полезное сообщение об ошибке в случае, если типы не совпадают. Проблема в том, что я не совсем уверен, что это действительный C или лучший способ в этом отношении.

Насколько я понимаю, в стандарте говорится, что вы можете преобразовать указатель функции, но результат вызова указателя функции не определен. В этом случае невозможно вызвать функцию во время выполнения. Достаточно ли этого, или стандарт означает, что вы даже не можете написать код, который нельзя вызвать, вызывающий функцию приведения?

10
задан a3f 30 March 2015 в 12:59
поделиться