Проверьте соглашение о вызовах типа указатель на функцию - PullRequest
6 голосов
/ 29 января 2011

Как проверить во время компиляции, что указатель функции имеет __stdcall соглашение о вызовах?

Что-то вроде

void foo() {}

static_assert(is_stdcall<decltype(&foo)>::value, "foo() must be stdcall");

или хотя бы

must_be_stdcall<T>(); // compiler error or warning if not stdcall

1 Ответ

5 голосов
/ 29 января 2011

MSVC имеет предупреждение компилятора C4440 :

// library code

#pragma warning(push)
#pragma warning(error: 4440)
template<typename F> void must_be_stdcall(F*) { typedef F __stdcall* T; }
#pragma warning(pop)

// test code

void __stdcall stdcall_fn() {}
void __cdecl cdecl_fn() {}

int main()
{
    must_be_stdcall(&stdcall_fn); // OK
    must_be_stdcall(&cdecl_fn); // error
}

Это может быть typedef decltype(foo) __stdcall* T;, где foo - это функция (обратите внимание, что должно быть foo, а не &foo), но она не работает со статическими функциями-членами.

...