2011-01-29 13 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

コンパイル時については、関数ポインタ*ではなく* functions *をチェックしたいと思われますか? –

+0

@Oli Charlesworth:関数ポインタ_タイプ_。 – Abyx

+1

@Abyx:* function-pointer *型を定義すると、その呼び出し規約が何であるかが定義されています。なぜあなたはそれをチェックする必要がありますか? –

答えて

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 
} 

それはfooがあるべきだと機能(注、あるtypedef decltype(foo) __stdcall* T;かもしれにfoo&fooではありません)、静的メンバー関数では機能しません。

関連する問題