没有typedef的函数指针

时间:2010-09-22 14:50:44

标签: c++ c function-pointers typedef syntactic-sugar

在不使用typedef的情况下,将prepreious声明的函数的类型用作函数指针是否可行?

功能声明:

int myfunc(float);

通过某种语法将函数声明用作函数指针

myfunc* ptrWithSameTypeAsMyFunc = 0;

7 个答案:

答案 0 :(得分:21)

不符合2003标准。是的,即将推出的C ++ 0x标准和MSVC 2010以及g ++ 4.5:

decltype(myfunc)* ptrWithSameTypeAsMyFunc = 0;

答案 1 :(得分:6)

是的,可以声明一个没有typedef的函数指针,但不能使用函数名来做到这一点。

通常使用typedef,因为声明函数指针的语法有点巴洛克式。但是,typedef不是必需的。你可以写:

int (*ptr)(float); 

ptr声明为指向float并返回int的函数的函数指针 - 不涉及typedef。但同样,没有语法允许您使用名称myfunc来执行此操作。

答案 2 :(得分:3)

  

在不使用typedef的情况下,将prepreious声明的函数的类型用作函数指针是否可行?

我要欺骗一下

template<typename T>
void f(T *f) {
  T* ptrWithSameTypeAsMyFunc = 0;
}

f(&myfunc);

当然,这并非完全没有陷阱:它使用函数,因此必须定义,而decltype之类的东西不使用函数,也不需要定义函数。

答案 3 :(得分:1)

不,不是现在。 C ++ 0x将改变auto的含义,并添加一个新关键字decltype,让您可以执行此类操作。如果你正在使用gcc / g ++,你也可以考虑使用它的typeof运算符,它非常相似(在处理引用时有一个细微的差别)。

答案 4 :(得分:1)

不,不是没有C ++ 0x decltype

int myfunc(float)
{
  return 0;
}

int main ()
{
  decltype (myfunc) * ptr = myfunc;
}

答案 5 :(得分:1)

gcc有typeof作为C的扩展(不了解C ++)(http://gcc.gnu.org/onlinedocs/gcc/Typeof.html)。

int myfunc(float);

int main(void) {
    typeof(myfunc) *ptrWithSameTypeAsMyFunc;
    ptrWithSameTypeAsMyFunc = NULL;
    return 0;
}

答案 6 :(得分:0)

int (*ptrWithSameTypeAsMyFunc)(float) = 0;  

有关基础知识的详情,请参阅here