我写了一个C++函数,我需要从C程序调用。为了使它可以从C中调用,我在功能声明上指定了extern "C"
。然后我编译了C++代码,但编译器(Dignus Systems/C++)为该函数生成了一个mangled name。所以,它显然没有兑现extern "C"
。仅在函数声明中需要extern“C”吗?
要解决此问题,我将extern "C"
添加到函数定义。在此之后,编译器生成可从C中调用的函数名称。从技术上讲,extern "C"
只需要在函数声明中指定。这是正确的吗? (C++ FAQ Lite就是一个很好的例子。)你是否也应该在函数定义中指定它?
下面就来演示这样的例子:
/* ---------- */
/* "foo.h" */
/* ---------- */
#ifdef __cplusplus
extern "C" {
#endif
/* Function declaration */
void foo(int);
#ifdef __cplusplus
}
#endif
/* ---------- */
/* "foo.cpp" */
/* ---------- */
#include "foo.h"
/* Function definition */
extern "C" // <---- Is this needed?
void foo(int i) {
// do something...
}
我的问题可能是不正确编码的东西的结果,或者我可能已经找到了编译器错误。无论如何,我想咨询一下stackoverflow,以确保我知道哪个技术上是“正确”的方式。
如果您在示例代码中显示foo.c中的外部“C”,您确定实际上获得了foo的篡改吗?或者这只是其他更复杂的代码中发生的事情?我经常将这个问题看作是忘记在foo.c中包含foo.h的一个症状。 – 2009-09-04 19:01:26
@布鲁克斯摩西:这是一个很好的观点。在我的实际代码中,比这个“foo”示例稍微复杂一点,我在“cpp”源文件中包含头文件。 是什么让我觉得编译器改变名字是这样的:如果我没有在函数定义中包含'extern“C”',那么编译器列表显示外部符号“foo_FPFPCc_v”。当包含“extern”C“'时,列表显示外部符号”foo“。 – bporter 2009-09-04 19:41:58
@bporter - 尝试使用简化示例的编译器可能会很有趣。如果它显示相同的行为,那么您可能需要向供应商发送便条。如果它没有显示相同的内容,那么你应该跟踪你真正的构建中发生了什么,因为这会表明错误的头部被引入(或者其他的东西使得函数声明被遗漏)。 – 2009-09-04 19:53:24