将 {具有 C 链接的函数指针} 分配给 {具有 C++ 链接的函数指针},反之亦然

2024-02-18

这段代码合法吗?

extern "C" typedef void (ft_blah_c)();
/*extern "C++"*/ typedef void (ft_blah_cpp)();

extern "C" void fn_blah_c() {}
/*extern "C++"*/ void fn_blah_cpp() {}

ft_blah_c *g_Blah_c = fn_blah_cpp; // <--- ?
ft_blah_cpp *g_Blah_cpp = fn_blah_c; // <--- ?

我有具有类似分配的真实代码,它编译和执行没有任何问题(MSVC 2010)。


一般来说,这不应该起作用。问题是当你打电话时fn_blah_c or fn_blah_cpp直接编译器knows要使用的函数和调用约定,但如果将它们存储在函数指针中,编译器只能看到该指针,并且只能使用函数指针的类型来确定如何传递参数和返回类型。

如果 C 和 C++ 的调用约定在您的环境中相同,那么它可以工作(这可能就是您的编译器允许它的原因),但通常情况并非如此,赋值应该失败。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

将 {具有 C 链接的函数指针} 分配给 {具有 C++ 链接的函数指针},反之亦然 的相关文章

随机推荐