函数指针类型的typedef

4

我想声明一个指向函数的指针类型,所以我尝试:

typedef void (*print)(void); 完美地工作了。

void (*print)(void); p是一个指针变量,不是一个类型。

typedef (void) (*print)(void); 错误:在“void”之前需要标识符或“(”。

typedef void (*)(void) Print;

错误:在Print之前需要“=”,“,”,“;”,“asm”或“_attribute_”。

我的问题是:

  1. 我必须使用typedef来声明函数指针类型吗?

  2. typedef (void) (*print)(void);为什么是错误的?这里的()是什么意思?

  3. 为什么我不能这样写:typedef void (*)(void) Print


声明函数指针类型时不需要使用typedef。 - mawia
如何做到这一点?请发布您的想法。 - Lidong Guo
2
你的所有问题基本上都可以用“因为语言设计者决定了这样”来回答。 - Per Johansson
在回答另一个问题时,我尝试解释如何声明函数指针。请参见https://dev59.com/8FnUa4cB1Zd3GeqPeNOY#6905987。 - Sjoerd
2个回答

10

正确的方式是:

typedef void (*print_function_ptr)(void)

它在变量/参数声明中的用法是:

print_function_ptr p;
  1. 声明变量不需要使用typedef。您可以直接编写void (*p)(void)来声明一个指向以void为参数并返回void的函数的变量p。但是,如果要声明指向函数的指针类型别名/名称,则typedef是必要的。

  2. 这并不意味着任何事情,它不是有效的C语法。

  3. 因为这不是C的工作方式。在C中,typedef模拟了变量的声明或定义方式。


我希望声明一个函数指针类型,而不是变量,有没有一种方法可以在不使用typedef的情况下实现这一点? - Lidong Guo
@LidongGuo:你所说的“声明函数指针类型”是什么意思?你可以声明一个类型为“指向函数”的对象,而不使用typedef。除了使用typedef创建随后可以使用的类型名称之外,没有其他方法。 - Jonathan Leffler
我希望能够声明一个类似于结构体名称的类型,然后我可以使用它来声明许多函数指针。 - Lidong Guo
1
@LidongGuo,这个答案告诉你如何做到这一点。在typedef之后,您只需执行以下操作即可拥有5个具有相同签名的函数指针:print_function_ptr p1, p2, p3, p4, p5; - blubberdiblub

3
  1. No, you don't have to use a typedef to create an object of type 'pointer to function':

    void somefunc(void (*pointer)(void))
    {
        (*pointer)();
        pointer();
    }
    

    However, there is no way to create a name for a type other than by using a typedef. I suppose you could indulge in macro hackery to generate a 'pointer to function', but after the macro is expanded, you'd have a 'pointer to function' written out:

    #define PTR_FUNC(func) void (*func)(void)
    void somefunc(PTR_FUNC(pointer)) { ... }
    
  2. The (void) notation as the type name is wrong. You don''t write: (int) x; and expect to declare a variable x -— it is a type cast. Same with the notation you're using in your typedef.

  3. You can't write typedef void (*)(void) Print; because it is not an allowed C syntax. You also can't write typedef [32] int name; either — it isn't valid C syntax.


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接