我正在研究一个线程池,为了避免使用长限定符名称,我想使用typedef
声明。
但这并不像看起来那么容易:
typedef unsigned ( __stdcall *start_address )( void * ) task;
当我以这种方式尝试时,我得到了:
error C3646: 'task' : unknown override specifier
错误,在玩了一会儿这个声明后,我被卡住了,找不到任何合理的解决方案来声明这种类型的typedef
.
我正在研究一个线程池,为了避免使用长限定符名称,我想使用typedef
声明。
但这并不像看起来那么容易:
typedef unsigned ( __stdcall *start_address )( void * ) task;
当我以这种方式尝试时,我得到了:
error C3646: 'task' : unknown override specifier
错误,在玩了一会儿这个声明后,我被卡住了,找不到任何合理的解决方案来声明这种类型的typedef
.
为函数指针创建typedef
别名时,别名在函数名位置,所以使用:
typedef unsigned (__stdcall *task )(void *);
task
现在是一个类型别名:指向一个函数的指针,该函数接受一个void
指针并返回unsigned
.
由于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;
}
这种语法比旧的语法好得多(对于模板,实际上使模板别名成为可能),但确实需要一个相当新的编译器。
旁注:该__stdcall
部分可能会在不同的编译器/编译器设置下破坏您的代码(除非该函数也显式声明为__stdcall
)。我会坚持默认的调用约定,只使用具有良好原因的专有编译器扩展。