extern“C”函数访问代码

时间:2012-01-10 22:11:58

标签: c++ c extern

说我有以下C ++代码:

int x;
some_class y;

extern "C" {
  void foo () {
    // do something with x
    // do something with y
  }
}

是否需要使用x声明y和/或extern "C"

4 个答案:

答案 0 :(得分:6)

没有。使用C ++语言链接访问函数和变量的extern "C"函数没有限制。

C ++ extern "C"函数通常用于为使用C ++语言链接的代码提供C接口,因此如果是这种情况则会有一点限制。

答案 1 :(得分:1)

C ++方法/函数支持重载,使它们以稍微复杂的方式链接。外部“C”的作用实际上是说“不要让我超载并使用好的旧C语言”,这使它与C代码兼容。

编辑:Charles Bailey指出我显然错误地以相同的方式连接变量。换句话说,如果变量由外部C代码使用(它们可能是因为它们不是静态的),则应将它们放在extern“C”中。如果您只是在文件内部或仅使用外部C ++代码中使用它们,那么您可以将它们保留在原来的位置。

答案 2 :(得分:1)

好吧,不需要使用extern "c"声明变量。 事实上,使用extern "C"甚至不需要使用函数,因为您使用extern "C"

的函数调用它们

您可以自由编写如下代码:

    void bla() {cout<<"bla\n";}
extern "C" void sh() {bla();}

函数“sh”将使用c ++编译器进行编译,因此可以自由调用bla。 extern "C"仅影响函数的名称。

答案 3 :(得分:-2)

extern "C"仅对函数有用,对数据无效。它定义了函数被装饰或修改的方式。装饰还取决于使用的调用约定。不能在C中使用类,也不能使用类作为参数的函数,即使在extern "C"块中也是如此。

extern "C"有意义,C库和C ++代码将使用C库。

总之,extern "C"中的一个类没有意义,x只是一个基本类型,内部或外部无关紧要。使用该功能的常规方法是将标题的所有内容都放在这样的块中。在标题中声明int并不是一个好主意!这将为每个翻译单元创建一个变量,并在链接时造成麻烦...不确定您打算如何处理类似于您发布的代码。