8

typedef int (xxx)(int yyy);似乎定义了一个名为的函数指针xxx,它指向一个带有整数参数的函数yyy

但我无法理解这种语法......任何人都可以给出一个很好的解释吗?


我发现typedef int xxx(int yyy);仍然有效。他们之间有什么区别吗?

4

3 回答 3

15

这定义了一个函数类型,而不是函数指针类型。

模式typedef是它修改任何声明,而不是声明对象,而是声明对象将具有的类型的别名。

这是完全有效的:

typedef int (xxx)(int yyy); // Note, yyy is just an unused identifier.
 // The parens around xxx are also optional and unused.

xxx func; // Declare a function

int func( int arg ) { // Define the function
    return arg;
}

C 和 C++ 语言明确地并且仁慈地不允许typedef在函数定义中使用名称作为整个类型。

于 2013-08-27T03:23:19.400 回答
0

typedef int (xxx)(int yyy);的,与typedef int xxx(int yyy);定义函数类型相同。您可以从第 156 页 C 11 标准草案 N1570 中找到示例。从该页面引用,

All three of the following declarations of the signal function specify exactly the same type, the first without making use of any typedef names.

    typedef void fv(int), (*pfv)(int);
    void (*signal(int, void (*)(int)))(int);
    fv *signal(int, fv *);
    pfv signal(int, pfv);
于 2013-08-27T03:27:33.290 回答
0

如果您x在声明中有一些声明符T x,则T x(t1 p1, t2 p2)表示带有参数 p1、p2 的函数,返回与之前声明符 x 相同的类型

声明符周围的括号意味着首先在括号内应用修饰符

在您的情况下,括号内没有修饰符。这意味着它们没有必要。

函数原型意味着某处有一个函数具有此签名,其名称为 Blah

带有函数原型的 Typedef 意味着让我们为函数签名命名 blah。这并不意味着存在具有此签名的任何功能。此名称可用作类型。例如:

typedef int xxx(int yyy);

xxx *func_ptr;       // Declaration of a variable that is a pointer to a function.
xxx *func2(int p1);  // Function that returns a pointer to a function.
于 2013-08-27T03:32:05.087 回答