是否可以在没有外部链接的情况下声明具有C链接的函数?在尝试编译时
extern "C" static void f() {}
我得到了
f.cc:1: error: invalid use of 'static' in linkage specification
在某种程度上是有道理的。在namespace { extern "C" void f() {} }
中,extern
说明符似乎覆盖了匿名名称空间的限制范围。
如果这不可能,将函数指针传递给C?
是否重要答案 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”只是设置链接,而寻址模式对于静态情况是静态的。