使用C++中的函数typedef定义函数

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定义具有此函数签名的函数?

dyp*_*dyp 6

引用当前的C++标准(C++ 11):

[dcl.fct]/10

函数类型的typedef可用于声明函数,但不能用于定义函数(8.4).[例:

typedef void F();
F fv;             // OK: equivalent to void fv();
F fv { }          // ill-formed
void fv() { }     // OK: definition of fv
Run Code Online (Sandbox Code Playgroud)

- 末端的例子]

也就是说,您可以声明但不能使用它来定义函数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)