Я думал о способах проверки типов в макросах C, и пока что лучший способ, который я придумал, таков:
#define ASSERT_PTYPE(TYPE, VALUE) (0 && (*(int (*)(TYPE*))0)(VALUE))
Это, очевидно, ожидает тип имя и указатель на этот тип. Аналогичный макрос ASSERT_TYPE также может быть создан. Кажется, это неплохо работает с GCC. Он даже дает очень полезное сообщение об ошибке в случае, если типы не совпадают. Проблема в том, что я не совсем уверен, что это действительный C или лучший способ в этом отношении.
Насколько я понимаю, в стандарте говорится, что вы можете преобразовать указатель функции, но результат вызова указателя функции не определен. В этом случае невозможно вызвать функцию во время выполнения. Достаточно ли этого, или стандарт означает, что вы даже не можете написать код, который нельзя вызвать, вызывающий функцию приведения?