c-指向函数的指针-一种不同的声明方法



在阅读这篇文章(精神病患者给出的答案)时,我了解了如何键入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?

如果functypedef用作函数指针,则语句

func *fp=&test; 

将是

func fp=&test;

相关内容