Код будет иметь неопределенное поведение, но по той причине, что стандарт C не определяет, что произойдет, когда указатель на функцию преобразуется в указатель на void
.
Преобразование конвертируемости указателя на функцию в указатель на void
указано как общее расширение ( C11 J.5.7 ), и POSiX требует этого. Однако, вероятно, все же следует использовать явное приведение.
Два указателя на функцию будут сравниваться равными друг другу, только если они указывают на одну и ту же функцию ( C11 6.5.9p6 )
Два указателя сравнивают равные, если и только [...], оба являются указателями на один и тот же объект (включая указатель на объект и подобъект в его начале) или функцию, [...]
Две функции с внутренней связью в разных единицах перевода различны, поэтому указатели на них должны сравниваться не одинаково; и void *
преобразование их аналогичным образом, если гарантируется обратное путешествие.
Я прочитал стандарт как таковой, что, если компоновщик объединяет два определения с идентичным кодом, реализация не соответствует. ( C11 6.2.2p2 )