在阅读这篇文章(精神病患者给出的答案)时,我了解了如何键入def并调用函数指针。但在考虑了typedef之后,我对它们进行了一些实验,并能够以这种方式调用函数:
typedef void func(unsigned char);
void test(unsigned char a);
int main()
{
unsigned char b=0U;
func *fp=&test;
while(1)
{
fp(b);
b++;
}
}
void test(unsigned char a)
{
printf("%d",a);
}
我不明白使用函数指针语法和这种方法有什么区别?两者似乎产生了几乎相同的功能。
样式
typedef void func_t (void);
...
funct_t* fp;
是声明函数指针的最清晰的方法之一。清除,因为它与C.的其余指针语法一致
它相当于可读性稍差的
typedef void (*func_t)(void);
func_t fp;
这反过来又相当于可读性差得多的
void (*fp)(void);
当您将这些作为参数传递给函数时,第一种样式的优势就显而易见了:
1) void sort (func_t* callback); // very clear and readable!
2) void sort (func_t callback); // hmm what is this? passing by value?
3) void sort (void(*callback)(void)); // unreadable mess
通常,将指针语法隐藏在typedef后面是个坏主意。函数指针也不例外。
您正在创建一个带有声明的函数指针,即
func *fp = &test; // fp is a function pointer!
另一种方法是对指针进行类型定义
typedef void (*func)(unsigned char);
func fp = &test; // Notice, no '*' in the declaration?
如果func
被typedef
用作函数指针,则语句
func *fp=&test;
将是
func fp=&test;