Как показать, что функция принадлежит typedef в C?
Если у меня есть typedef для указателя функции, такой как
typedef void (* specialFunction) (void);
как я могу показать, что я объявляю функцию этого типа, а не просто функцию с одинаковой сигнатурой?
Я не пытаюсь что-либо применять, просто чтобы сделать код более разборчивым (и поддерживаемым) и сделать очевидным, что объявление функции - это, скажем, обратный вызов таймера или подпрограмма ISR.
Очевидно, я не могу
extern specialFunction mySpecialFunction(void);
но есть ли способ, которым я могу использовать specialFunction
в декларации, чтобы отличить mySpecialFunction
от myBoringlyNormalFunction
?
3 ответа
void (* specialFunction) (void);
тип указателя Вы не можете объявить функцию типа указателя. Я предполагаю, что вы имеете в виду, что вы хотите объявить функцию, как void f(void);
но на основе этого typedef.
Если это так, вы можете сделать typedef типом функции:
typedef void specialFunction(void);
Затем вы можете объявить функцию этого типа и указатель на такую функцию:
specialFunction func_name;
specialFunction *p_func = &func_name;
Многие люди считают, что отказ от указателей typedefs облегчает чтение кода, поскольку наличие *
Символ четко указывает, работаем ли мы с указателем или нет.
Вы ничего не можете сделать в этом. Однако для визуального представления вы можете использовать самоопределения, такие как Adam Dunkels, в protothreads:
typedef void (* specialFunction) (void);
#define TIMERCALLBACK(x) specialFunction x
и затем объявите функцию следующим образом:
TIMERCALLBACK(mycallback(void)) {
//do your job
}
Это только один из способов представления функции как timer callback
например.
Вы не можете объявлять такие функции, только переменные. Но вы можете использовать макрос, чтобы гарантировать, что ваши функции объявлены правильно, как это.
typedef void (* specialFunction) (void);
#define SPECIALFUNCTION(x) void x(void)
extern SPECIALFUNCTION(mycallback);
int main(void)
{
specialFunction foo=mycallback;
foo();
}
SPECIALFUNCTION(mycallback)
{
printf("test\n");
}