2011-01-29 16 views
6

¿Cómo comprobar en tiempo de compilación que el puntero de función tiene la convención de llamadas __stdcall?Comprobar convención de llamadas del tipo de puntero a función

Algo así como

void foo() {} 

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

o al menos

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

Si estás hablando de tiempo de compilación, entonces probablemente presumiblemente quieres verificar * funciones *, no * indicadores de función *? –

+0

@Oli Charlesworth: punteros-función _types_. – Abyx

+1

@Abyx: si define un tipo * function-pointer *, sabrá por definición cuál es su convención de llamadas. ¿Por qué tendrías que verificarlo? –

Respuesta

5

MSVC tiene la 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 
} 

Puede ser typedef decltype(foo) __stdcall* T; donde foo es una función (nota, que no debe ser foo, no &foo), pero no funciona con funciones miembro estáticas.

Cuestiones relacionadas