函数指针typedef的语法是什么?

时间:2012-08-30 13:19:07

标签: c++ c function-pointers typedef

我正在处理一个线程池,并且为了避免长限定符名称,我想使用typedef声明。

但它并不像看起来那么容易:

typedef unsigned ( __stdcall *start_address )( void * ) task;

当我以这种方式尝试时,我得到了:

error C3646: 'task' : unknown override specifier

错误,在使用此声明播放一段时间后,我遇到了困难,无法找到任何合理的解决方案来用于声明此类typedef

3 个答案:

答案 0 :(得分:15)

为函数指针创建typedef别名时,别名位于函数 name 位置,因此请使用:

typedef unsigned (__stdcall *task )(void *);

task现在是以下类型的别名:指向函数的指针,该函数使用void指针并返回unsigned

答案 1 :(得分:7)

由于hmjd的答案已被删除......

在C ++ 11中,开发了一个完整的newsome 别名语法,使这些事情变得更加容易:

using task = unsigned (__stdcall*)(void*);

等同于typedef unsigned (__stdcall* task)(void*);(注意函数签名中间别名的位置......)。

它也可以用于模板:

template <typename T>
using Vec = std::vector<T>;

int main() {
    Vec<int> x;
}

这种语法比旧语法更好(对于模板,实际上可以使模板别名成为可能),但确实需要一个非常新的编译器。

答案 2 :(得分:0)

旁注:__stdcall部分可能会在不同的编译器/编译器设置下破坏您的代码(除非该函数也明确声明为__stdcall)。我只使用具有良好原因的专有编译器扩展来坚持默认的调用约定。