函数声明只需要extern"C"吗?

bpo*_*ter 34 c c++ extern extern-c

我写了一个C++函数,我需要从C程序调用.为了使它可以从C调用,我extern "C"在函数声明中指定.然后我编译了C++代码,但编译器(Dignus Systems/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...
}
Run Code Online (Sandbox Code Playgroud)

我的问题可能是错误编码的结果,或者我可能发现了编译器错误.在任何情况下,我都想咨询stackoverflow以确保我知道哪种技术上是"正确的"方式.

Mic*_*urr 36

extern "C"只要声明具有它并且已经在定义的汇编中看到,就不应该在函数定义上要求' '.该标准明确规定(7.5/5链接规范):

在看到明确的链接规范之后,可以在没有链接规范的情况下声明函数; 前面声明中明确指定的链接不受此类函数声明的影响.

但是,我通常也把' extern "C"'放在定义上,因为它实际上是一个带有外部"C"连接的函数.很多人讨厌不必要的,冗余的东西是声明(比如加上virtual方法覆盖),但我不是其中之一.

  • 我以为我是唯一一个将`virtual`放在方法覆盖上的人:-) (3认同)