cho*_*wey 4 c++ typedef visual-studio-2012
我正在Windows中实现一项服务.VisualStudio 2012具有以下函数typedef:
typedef VOID WINAPI SERVICE_MAIN_FUNCTIONW (
DWORD dwNumServicesArgs,
LPWSTR *lpServiceArgVectors
);
Run Code Online (Sandbox Code Playgroud)
还有一个函数指针typedef:
typedef VOID (WINAPI *LPSERVICE_MAIN_FUNCTIONW)(
DWORD dwNumServicesArgs,
LPWSTR *lpServiceArgVectors
);
Run Code Online (Sandbox Code Playgroud)
如何使用typedef定义具有此函数签名的函数?
引用当前的C++标准(C++ 11):
[dcl.fct]/10
函数类型的typedef可用于声明函数,但不能用于定义函数(8.4).[例:
Run Code Online (Sandbox Code Playgroud)typedef void F(); F fv; // OK: equivalent to void fv(); F fv { } // ill-formed void fv() { } // OK: definition of fv- 末端的例子]
也就是说,您可以声明但不能使用它来定义函数typedef.您必须明确指定签名,请参阅Alex Farber的答案.
在某种程度上,你可以使用typedef"定义"函数,但它涉及一些模板魔术.这是一个有趣的例子,表明你可以实际使用它来定义一个函数.
// extra definitions for SSCCE
typedef unsigned int DWORD;
typedef wchar_t* LPWSTR;
#define VOID void
#define WINAPI
// function ptr
typedef VOID (WINAPI *LPSERVICE_MAIN_FUNCTIONW)(
DWORD dwNumServicesArgs,
LPWSTR *lpServiceArgVectors
);
// function typedef
typedef VOID WINAPI SERVICE_MAIN_FUNCTIONW (
DWORD dwNumServicesArgs,
LPWSTR *lpServiceArgVectors
);
template < typename... TT >
struct disassemble_funcptr
{};
template < typename Ret, typename... Args >
struct disassemble_funcptr < Ret(Args...) >
{
typedef Ret return_type;
static Ret Func(Args...)
{
/* your code here */
}
};
// using the typedef SERVICE_MAIN_FUNCTIONW to define the function
LPSERVICE_MAIN_FUNCTIONW my_func_ptr =
& disassemble_funcptr < SERVICE_MAIN_FUNCTIONW > :: Func;
int main()
{
LPWSTR str = nullptr;
my_func_ptr(42, &str);
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
2616 次 |
| 最近记录: |