具有C链接的非外部函数

时间:2011-06-10 23:24:39

标签: c++ c linkage

是否可以在没有外部链接的情况下声明具有C链接的函数?在尝试编译时

extern "C" static void f() {}

我得到了

f.cc:1: error: invalid use of 'static' in linkage specification

在某种程度上是有道理的。在namespace { extern "C" void f() {} }中,extern说明符似乎覆盖了匿名名称空间的限制范围。

如果这不可能,将函数指针传递给C?

是否重要

3 个答案:

答案 0 :(得分:11)

你可以做到

extern "C" {
  static void f() {}
}

这将为函数f提供类型C链接,这实际上意味着它在您的平台上使用C调用约定。函数的名称仍然具有C ++ /内部链接,因为语言链接规范仅适用于外部链接的函数名称。

如果直接在声明中指定extern "C",则标准指定extern "C"也被视为存储类说明符,因此如果您要添加static,那么您会发生冲突。

  

将函数指针传递给C

时是否重要?

理论上讲它很重要 - 允许实现在行为上与调用类型具有C ++链接的函数调用类型具有C链接的函数不同。我不知道实现细节,只是规范说的内容。最好遵循规范,你是安全的。

答案 1 :(得分:0)

您可以将函数指针传递给C ++非成员或静态成员函数到C函数中,除非您为该C ++函数指定了不同的调用约定,否则它应该可以正常工作。常规C ++函数应该使用C调用约定,因此你在这方面做得很好。

将指针传递给非静态成员函数的主要原因并不容易,因为您将以某种方式需要传递有关对象的this指针的信息,这通常发生在任何成员函数的隐式,不可见参数。

答案 2 :(得分:0)

我刚刚成功使用了约翰内斯的回答。谢谢老兄!

由于我不能(还)评论,但可以回答,让我添加这个数据点。

我在<the-file>.cpp中输入了(详情省略了:-):

extern "C" {
    extern int myfunction(<the-args>);
}

extern int myfunction(<the-args>) {
    <the-code>
}

还有:

extern "C" {
    static int myfunction(<the-args>);
}

static int my function(<the-args>) {
    <the-code>
}

我编写了两种方法,并做了一个:

nm -g <the-file>.o | grep myfuncion

依次对两个目标文件。

我观察到,对于extern,这是一个条目,但对于静态情况,没有。

所以我很高兴现在外部的“extern”只是设置链接,而寻址模式对于静态情况是静态的。