一个奇怪的使用typedef

时间:2011-09-26 16:08:36

标签: c++ typedef

我以前从未在c ++中看到这样的语法:

typedef int (callback)(int);

这究竟意味着什么?我只是发现如果我创建一个声明

  callback a;

它的效果与前向函数声明非常相似。

下面是我写的代码

#include<cstdio>

int callbackfunc(int i)
{
    printf("%d\n",i);
    return i*i;
}

// you can also use typedef int (callback)(int) here!
typedef int (*callback)(int);

void func(callback hook)
{
    hook(hook(3));
}

int main()
{
    func(callbackfunc);
    getchar();
        return 0;
}

您可以使用

typedef int (*callback)(int);//this is very common to use

在此代码中,但如果我们将其更改为

typedef int (callback)(int); //I'm puzzled by this !

这也会得到相同的结果!

我知道typedef int (*callback)(int)typedef int (callback)(int)
两个完全不同的东西。

2 个答案:

答案 0 :(得分:11)

由于在参数声明中, function-type 被调整为指向函数类型 >

typedef int type(int); 
typedef int (*type)(int); 

第一个typedef定义了一个名为function-type的类型,而第二个typedef定义了一个名为pointer-to-function-type的类型。在参数声明中,函数类型被调整为成为函数类型的指针。

§13.1/ 3(C ++ 03)说,

  

参数声明只有一个是函数类型而另一个是指向同一函数类型的指针是等效即,调整函数类型以成为函数类型的指针(8.3.5)

[Example:
    void h(int());
    void h(int (*)()); // redeclaration of h(int())
    void h(int x()) { } // definition of h(int())
    void h(int (*x)()) { } // ill-formed: redefinition of h(int())
]

函数类型

的独占使用的一个有趣示例

假设您有一个typedef,定义为:

typedef void funtype();

然后您可以使用它将 member-function 定义为:

struct A
{
   //member function declaration. 
    funtype f; //equivalent to : void f();
};

void A::f() //definition
{
  std::cout << "haha" << std::endl;
}

测试代码:

int main() {
        A a;
        a.f(); //call member function
}

输出:

haha

在线演示:http://ideone.com/hhkeK

答案 1 :(得分:3)

这是因为函数在必要时隐式变为函数指针。这些是相同的:

func(callbackfunc);

func(&callbackfunc);