本文介绍了为什么你需要"外部C"对于C ++回调的C函数?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我觉得在升压code这样的例子。

 名字空间boost {
   命名空间{
     为externCvoid *的thread_proxy(无效* F)
     {
       ....
     }   } //匿名
   无效线程:: thread_start(...)
   {
       ...
       在pthread_create(东西,0,&安培; thread_proxy,something_else);
       ...
   }
} //提振

为什么你真正需要这个的externC

很显然,在 thread_proxy 函数是私有的内部,我不希望它
将错位为thread_proxy因为我其实并不需要它缺胳膊少腿的。

事实上,在我写,而且运行在许多平台上的所有我的code,我从来没有使用的externC这工作过AS-与正常功能。

为什么的externC补充?


我的问题是,的externC功能污染全局命名空间,但实际上并没有隐藏的作者的期望。

这不是一个重复的!
我不是在谈论重整内外联动。正是在这样的code外部联动是不需要的明显!

答: C和C ++函数的调用约定不一定是一样的,所以你需要创建一个用C调用约定。见7.5的C ++标准(P4)。


解决方案

Regardless, it's still going to be mangled. (Had it not been extern "C") That's just how the compiler works. I agree it's conceivable a compiler could say "this doesn't necessarily need to be mangled", but the standard says nothing on it. That said, mangling doesn't come into play here, as we aren't trying to link to the function.

Writing on different platforms has nothing to do with extern "C". I expect all standard C++ code to work on all platforms that have a standard C++ compliant compiler.

extern "C" has to do with interfacing with C, which pthread is a library of. Not only does it not mangle the name, it makes sure it's callable with the C calling convention. It's the calling convention that needs to be guaranteed, and because we can't assume we are running on a certain compiler, platform, or architecture, the best way to try and do that is with the functionality given to us: extern "C".

There's nothing polluting about the above code. It's in an unnamed namespace, and not accessible outside the translation unit.

这篇关于为什么你需要"外部C"对于C ++回调的C函数?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

08-14 08:39