10

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

extern "C" static void f() {}

我明白了

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

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

如果这是不可能的,那么将函数指针传递给 C 是否重要?

4

3 回答 3

11

你可以做

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

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

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

将函数指针传递给C时是否重要

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

于 2011-06-10T23:33:28.860 回答
0

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

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

于 2011-06-10T23:29:56.750 回答
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”只是设置了链接,并且寻址模式对于静态情况是静态的。

于 2017-08-25T00:30:22.243 回答