6

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

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

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

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

error C3646: 'task' : unknown override specifier

错误,在玩了一会儿这个声明后,我被卡住了,找不到任何合理的解决方案来声明这种类型的typedef.

4

3 回答 3

15

为函数指针创建typedef别名时,别名在函数位置,所以使用:

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

task现在是一个类型别名:指向一个函数的指针,该函数接受一个void指针并返回unsigned.

于 2012-08-30T13:21:55.510 回答
7

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

在 C++11中,已经开发了一个全新的别名语法,以使这些事情变得更容易:

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

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

它也可以用于模板:

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

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

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

于 2012-08-30T13:48:59.677 回答
0

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

于 2012-08-30T14:21:34.023 回答