更新时间:2022-11-23 18:39:53
很显然,在
thread_proxy
函数是私有的内部,我不认为它会错位为thread_proxy因为我其实并不需要它缺胳膊少腿在所有
块引用>尽管如此,它仍然会被截断。 (如果不是因为
的externC
)这只是编译器如何工作。我同意这是可以想象的编译器可以说,这并不一定需要进行错位,但标准说就可以了什么。这就是说,识别码不来这里发挥作用,因为我们不是要链接到的功能。
事实上,在我写,而且运行在许多平台上的所有我的code,我从来没有使用
的externC
这工作过AS-与正常功能。
块引用>在不同的平台写作无关,与
的externC
。我希望所有的标准C ++ code就具有标准的C ++编译器兼容所有平台上工作。
的externC
具有与C,其中的pthread是库接口做。它不仅没有裂伤的名字,它可以确保它的调用与C调用约定。这是调用约定,需要得到保证,因为我们不能假定我们是在一个特定的编译器,平台或架构上运行,***的办法,试图做的是给我们的功能:为externC
。
我的问题是,
的externC
功能污染全局命名空间,但实际上并没有隐藏的作者的期望。
块引用>有什么污染有关上述code。这是在一个无名的命名空间,而不是翻译单元外部访问。
I find such examples in Boost code.
namespace boost { namespace { extern "C" void *thread_proxy(void *f) { .... } } // anonymous void thread::thread_start(...) { ... pthread_create(something,0,&thread_proxy,something_else); ... } } // boost
Why do you actually need this
extern "C"
?It is clear that the
thread_proxy
function is private internal and I do not expect that it would be mangled as "thread_proxy" because I actually do not need it mangled at all.In fact, in all my code that I had written and that runs on many platforms, I never used
extern "C"
and this had worked as-is with normal functions.Why is
extern "C"
added?
My problem is that
extern "C"
functions pollute the global namespace and they are not actually hidden as the author expects.This is not a duplicate! I'm not talking about mangling and external linkage. It is obvious in this code that external linkage is unwanted!
Answer: The calling conventions of C and C++ functions are not necessarily the same, so you need to create one with the C calling convention. See 7.5 (p4) of C++ standard.
It is clear that the
thread_proxy
function is private internal and I do not expect that it would be mangled as "thread_proxy" because I actually do not need it mangled at all.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.In fact, in all my code that I had written and that runs on many platforms, I never used
extern "C"
and this had worked as-is with normal functions.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"
.My problem is that
extern "C"
functions pollute the global namespace and they are not actually hidden as the author expects.There's nothing polluting about the above code. It's in an unnamed namespace, and not accessible outside the translation unit.