typedef一个函数指针类型

时间:2013-09-05 14:17:35

标签: c function pointers typedef

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

typedef void (*print)(void);完美无缺

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

typedef (void) (*print)(void);错误预期标识符或'('在'void'之前

typedef void (*)(void) Print;

错误:在'打印'之前预期'=',',',';','asm'或'_ 属性 _'。

我的问题是:

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

  2. 为什么typedef (void) (*print)(void);错了? ()在这里的含义是什么?

  3. 为什么我不能用这种方式写作:typedef void (*)(void) Print

2 个答案:

答案 0 :(得分:11)

正确的方法是:

typedef void (*print_function_ptr)(void)

及其对变量/参数声明的用法是:

print_function_ptr p;
  1. 您不需要typedef来声明变量。您可以直接编写void (*p)(void)来声明一个变量p,该变量指向一个取void并返回void的函数。但是,要为函数指针声明类型别名/名称,typedef就是工具。

  2. 这并不意味着它不是有效的C语法。

  3. 因为它不是C的工作方式。 C中的Typedef模仿了如何声明或定义变量。

答案 1 :(得分:3)

  1. 不,您不必使用typedef来创建“指向函数的指针”类型的对象:

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

    但是,除了使用typedef之外,无法为其他类型创建名称。我想你可以沉迷于宏hackery来生成一个'指向函数的指针',但是在扩展宏之后,你会写出一个'指向函数的指针':

    #define PTR_FUNC(func) void (*func)(void)
    void somefunc(PTR_FUNC(pointer)) { ... }
    
  2. (void)表示法作为类型名称是错误的。你不写:(int) x;并期望声明一个变量x - 它是一个类型转换。与您在typedef中使用的符号相同。

  3. 您无法编写typedef void (*)(void) Print;,因为它不是允许的C语法。你也不能写typedef [32] int name; - 它不是有效的C语法。