2013-09-05 58 views
4

我要声明指针类型的指向一个功能,所以我尝试:的typedef函数指针类型

typedef void (*print)(void);完美的作品

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

typedef (void) (*print)(void);误差预期标识符或 '(' 前 '无效'

typedef void (*)(void) Print;

错误:预期 '=', '', ';', 'ASM' 或“_ 属性 _ 。“前 '

打印' 我的问题是:

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

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

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

+0

您不需要typedef来声明函数指针typer。 – mawia

+0

如何做到这一点?请张贴想法。 –

+2

你的所有问题都可以用“因为语言设计者决定这样做”几乎可以回答。 –

回答

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中的Typedefs模仿变量是如何声明或定义的。

+0

我希望声明一个函数指针类型,而不是一个变量,有没有办法做到这一点没有typedef? –

+0

@LidongGuo:'声明一个函数指针类型'是什么意思?你可以声明一个类型为“指向函数的指针”的对象而不用'typedef'。除了使用'typedef'来创建一个你随后可以使用的类型名称之外,没有办法。 –

+0

我希望声明一个类似结构体的类型,然后我可以使用它声明很多函数指针' –

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

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

    然而,有没有方法来创建一个名称对于通过使用typedef以外的类型。我想你可以在宏观两轮牛车生成一个“函数指针”沉迷,但宏展开后,你就会有一个“函数指针”写出来:

    #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语法。