【发布时间】:2009-09-04 18:30:02
【问题描述】:
我编写了一个需要从 C 程序调用的 C++ 函数。为了使它可以从 C 中调用,我在函数 declaration 上指定了extern "C"。然后我编译了 C++ 代码,但编译器 (Dignus Systems/C++) 为函数生成了一个mangled name。所以,它显然不尊重extern "C"。
为了解决这个问题,我将extern "C" 添加到函数定义。在此之后,编译器生成了一个可从 C 调用的函数名。
从技术上讲,extern "C" 只需要在函数声明中指定。这是正确的吗? (C++ FAQ 有一个很好的例子。)你是否也应该在函数定义中指定它?
这里有一个例子来证明这一点:
/* ---------- */
/* "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 中的 extern "C",您确定您确实得到了 foo 的修改吗?或者这只是在其他更复杂的代码中发生的事情?我经常将此问题视为忘记在 foo.c 中包含 foo.h 的症状。
-
@Brooks Moses:这很好。在我的实际代码中,它比这个“foo”示例稍微复杂一些,我在“cpp”源文件中包含了头文件。是什么让我认为编译器正在修改名称:如果我没有在函数定义中包含“extern“C””,那么编译器列表会显示外部符号“foo_FPFPCc_v”。当包含 'extern "C"' 时,列表显示外部符号 "foo"。
-
@bporter - 尝试一下编译器对您的简化示例所做的事情可能会很有趣。如果它显示相同的行为,那么您可能需要向供应商发送注释。如果它没有显示相同的内容,那么您应该跟踪实际构建中发生的情况,因为这表明引入了错误的标头(或其他原因导致函数声明被遗漏)。跨度>
-
@Michael Burr - 这是一个很好的观点,这可能是一个构建问题(例如,包含其他一些标题等)。我会尝试一下,如果我学到任何可能对其他人有用的新东西,我会在这里发表评论。谢谢!