检查函数指针类型的调用约定

发布于 2024-10-14 21:19:43 字数 286 浏览 3 评论 0原文

如何在编译时检查函数指针是否具有 __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

How to check at compile-time that function pointer has the __stdcall calling convention?

Something like

void foo() {}

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

or at least

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

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

遇到 2024-10-21 21:19:43

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 ),但它不适用于静态成员函数。

MSVC has the 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
}

It may be typedef decltype(foo) __stdcall* T; where foo is a function (note, that there should be foo, not &foo), but it doesn't works with static member functions.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文