我正在处理一个线程池,并且为了避免长限定符名称,我想使用typedef
声明。
但它并不像看起来那么容易:
typedef unsigned ( __stdcall *start_address )( void * ) task;
当我以这种方式尝试时,我得到了:
error C3646: 'task' : unknown override specifier
错误,在使用此声明播放一段时间后,我遇到了困难,无法找到任何合理的解决方案来用于声明此类typedef
。
答案 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
)。我只使用具有良好原因的专有编译器扩展来坚持默认的调用约定。