В C я могу выразить указатель на функцию const следующим образом:
typedef void fun_t(void);
const fun_t *fp;
(Я не знаю, имеет ли тип fp какое-либо практическое применение, но это реальный и отдельный тип; например, объявление void (*f)(const fun_t *fp); допустимо, а инициализация этой переменной с помощью (void (*)(fun_t *fp))NULL недействительна C)
Я обнаружил, что в C23 или GCC этот тип можно выразить без определения типа, используя typeof:
const typeof(void (void)) *fp_c23;
Есть ли способ выразить тип более напрямую, не используя ни typedef, ни typeof?





void (*const fp)(void); используется десятилетиями.
объявление void (*f)(const fun_t *fp); действует
const есть расширение GCC, оно недопустимо для C и недопустимо для C23, а const typeof(void (void)) *fp_c23; также недопустимо. Если вы посмотрите на сообщение об ошибке:
<source>:5:7: note: expected '__attribute__((const)) void (*)(void)' but argument is of type 'void (*)(void (*)(void))'
const интерпретируется как расширение GCC __attribute__((const)). См. https://gcc.gnu.org/onlinedocs/gcc/Common-Function-Attributes.html. Если вы скомпилируете в педантичном порядке, вы увидите:
warning: ISO C forbids qualified function types [-Wpedantic]
Итог: если вам нужен указатель на функцию void (void) с атрибутом const GCC, вы просто должны просто объявить его в GCC обычным способом.
__attribute__((const)) void (*fp1)(void);
const void (*fp2)(void);
Примечание: функция с атрибутом const, возвращающим void, не имеет особого смысла.
Я почти уверен, что
const fun_t *fp;недопустим в C, поскольку функции не могут быть квалифицированы. Это означает, что в C вы не можете объявить указатель на функцию таким образом. Ни один из ваших примеров не компилируется.void fun (void);...typeof(fun)* fp_c23;хотя это нормально. И вы можетеconstквалифицировать сам указатель на функцию.