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 テスト;」を試しました。しかし、それはコンパイルされません。
編集 - 使用シナリオの例を次に示します。
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
}
代わりにかなり乱雑に見えます。