Вы можете преобразовать указатели на функции в указатели других типов в функции, которые вам нужны (C 2018 6.3.2.3 8: «Указатель на функцию одного типа может быть преобразован в указатель на функцию другого типа…»), но если вы используете преобразованный указатель для вызова функции с несовместимым типом, стандарт C не определяет поведение ( ibid : «… если преобразованный указатель используется для вызова функциичей тип не совместим с ссылочным типом, поведение не определено. »).
Функция, которая возвращает struct A_return_type *
, не совместима с функцией, которая возвращает union return_types *
. Вы почти сохранены в 6.2.5 28, где говорится: «… Все указатели на типы структуры должны иметь те же требования к представлению и выравниванию, что и другие. Все указатели на типы объединений должны иметь те же требования к представлению и выравниванию, что и другие ... », а в сноске говорится:« Те же требования к представлению и выравниванию предназначены для обеспечения взаимозаменяемости в качестве аргументов функций, возвращаемых значений из функций и членов объединений ». . »Эта взаимозаменяемость означает, что функция, возвращающая struct foo *
, совместима с функцией, возвращающей struct bar *
. К сожалению, вы вызываете функцию, которая возвращает указатель на структуру с выражением для функции, которая возвращает указатель на объединение, и в стандарте не говорится, что они имеют одинаковые требования к представлению и выравниванию или что они взаимозаменяемы.