4

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
}

代わりにかなり乱雑に見えます。

4

1 に答える 1

3

私の意見ではひどいハックですが、テンプレートの特殊化でそれができるかどうかを試してみたところ、実際に機能しました. これを試して:

#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 でコンパイルおよび動作します。

于 2013-07-17T17:48:08.817 に答える