【发布时间】:2010-04-07 16:31:49
【问题描述】:
我在 Boost 代码中找到了这样的例子。
namespace boost {
namespace {
extern "C" void *thread_proxy(void *f)
{
....
}
} // anonymous
void thread::thread_start(...)
{
...
pthread_create(something,0,&thread_proxy,something_else);
...
}
} // boost
为什么你真的需要这个extern "C"?
很明显thread_proxy 函数是私有的内部函数,我不希望它
将被修改为“thread_proxy”,因为我实际上根本不需要它。
事实上,在我编写并在许多平台上运行的所有代码中,我从未使用过extern "C",而且它在正常功能下都可以正常工作。
为什么要添加extern "C"?
我的问题是extern "C" 函数污染了全局命名空间,它们实际上并没有像作者期望的那样隐藏。
这不是重复的! 我不是在谈论修饰和外部链接。在这段代码中很明显不需要外部链接!
答案: C 和 C++ 函数的调用约定不一定相同,所以需要创建一个符合 C 调用约定的。请参阅 C++ 标准的 7.5 (p4)。
【问题讨论】:
-
@Billy ONeal 这不是骗人的......正如我所说的那样,那里不需要修改。我知道如何使用 extern "C" 来解决管理问题。
-
@Artyom:名称修改是支持命名空间所必需的——您抱怨的功能
extern "C"与之冲突。 -
@Billy 我知道这一点!但即使不需要链接,仍然使用“extern C”!
-
@Billy ONeal:C 回调不需要外部链接。