2011-01-29 10 views
6

Come verificare in fase di compilazione che il puntatore di funzione abbia la convenzione di chiamata __stdcall?Verificare la convenzione di chiamata del tipo puntatore-a-funzione

Qualcosa di simile

void foo() {} 

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

o almeno

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

Se parli di tempo di compilazione, allora presumibilmente vuoi controllare * funzioni *, non * puntatori di funzione *? –

+0

@Oli Charlesworth: puntatori di funzioni _types_. – Abyx

+1

@Abyx: se si definisce un tipo * function-pointer *, si conosce per definizione qual è la sua convenzione di chiamata. Perché dovresti controllarlo? –

risposta

5

MSVC ha il 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 
} 

Può essere typedef decltype(foo) __stdcall* T; dove foo è una funzione (nota, che non dovrebbe essere foo, non &foo), ma non funziona con le funzioni membro statiche.

Problemi correlati