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

4

2 回答 2

10

正确的方法是:

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 模仿变量的声明或定义方式。

于 2013-09-05T14:25:34.507 回答
3
  1. 不,您不必使用 atypedef创建“函数指针”类型的对象:

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

    但是,除了使用typedef. 我想你可以沉迷于宏hacky来生成一个“指向函数的指针”,但是在宏展开之后,你会写出一个“指向函数的指针”:

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

于 2013-09-05T14:27:31.550 回答