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