gpt4 book ai didi

c++ - 没有#define 的调用约定 "defines"

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:03:21 32 4
gpt4 key购买 nike

在 Microsoft 的 WinDef.h 中引入了几个用于回调的#defines:

#ifdef _MAC
#define CALLBACK PASCAL
#define WINAPI CDECL
#define WINAPIV CDECL
#define APIENTRY WINAPI
#define APIPRIVATE CDECL
#ifdef _68K_
#define PASCAL __pascal
#else
#define PASCAL
#endif
#elif (_MSC_VER >= 800) || defined(_STDCALL_SUPPORTED)
#define CALLBACK __stdcall
#define WINAPI __stdcall
#define WINAPIV __cdecl
#define APIENTRY WINAPI
#define APIPRIVATE __stdcall
#define PASCAL __stdcall
#else
#define CALLBACK
#define WINAPI
#define WINAPIV
#define APIENTRY WINAPI
#define APIPRIVATE
#define PASCAL pascal
#endif

有没有办法在没有预处理器宏的情况下做类似的事情?我想要一些东西,它解决了 Unix 和 Windows 上不同的调用约定,但与宏不同的是,它可以命名空间。

我试过“typedef __stdcall test;”但这不能编译。

编辑 - 这是一个示例使用场景:

namespace Thread
{
typedef startRoutineReturnType (startRoutineCallingConvention *startRoutineCallback)(void* pArg);
}

Thread::startRoutineReturnType Thread::startRoutineCallingConvention startRoutine(void* pArg);

这样 startRoutine 可以在所有平台上确认该回调的签名,尽管回调的调用约定在平台之间有所不同。当有可能很多函数必须确认那个回调签名时,那么像

#ifdef UNIX
void* foo(void* pArg)
#elif WINDOWS
DWORD WINAPI foo(LPVOID pArg)
#else
// something else
#endif
{
// body
}

反而看起来很乱。

最佳答案

在我看来这是一个糟糕的 hack,但我尝试看看我是否可以使用模板特化来做到这一点并且它确实有效。试试这个:

#include <iostream>

enum CALLCONVENTION
{
STDCALL,
CDECL
};

template <CALLCONVENTION Convention>
void Function()
{
}

template<>
void __stdcall Function<STDCALL>()
{
std::cout << "STDCALL" << std::endl;
}

template<>
void __cdecl Function<CDECL>()
{
std::cout << "CDECL" << std::endl;
}

namespace StdCall
{
void Foo()
{
Function<STDCALL>();
}
}

namespace CDecl
{
void Foo()
{
Function<CDECL>();
}
}

int main(void)
{
Function<STDCALL>();
Function<CDECL>();
StdCall::Foo();
CDecl::Foo();

return 0;
}

它在 Visual Studio 2010 上编译和运行。

关于c++ - 没有#define 的调用约定 "defines",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17706375/

32 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com