2011-01-29 3 views
6

Как проверить во время компиляции, что указатель функции имеет соглашение о вызове __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 
+0

Если вы говорите о времени компиляции, то, по-видимому, вы хотите проверить * функции *, а не * указатели на функции *? –

+0

@Oli Charlesworth: функции-указатели _types_. – Abyx

+1

@Abyx: Если вы определяете тип * function-pointer * type, вы знаете по определению, что такое его соглашение о вызове. Зачем вам это нужно проверять? –

ответ

5

MSVC имеет C4440 compiler warning:

// 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 функция (обратите внимание, что должно be foo, а не &foo), но он не работает со статическими функциями-членами.