0

指向(非成员)C++ 函数的指针在 C++ 和 C 之间是否兼容?

给定例如 C 代码

void  doit(void (*cb)(int i))
{
     cb(100);
}

是否可以使用 C++ 函数指针从 C++ 代码调用 do_it 函数(具有 C 链接),例如:

namespace {
  void my_function(int i) {
    //...
  }
  void other_function() { 
      doit(my_function);
  }
};

其中 my_function 是非成员函数还是静态成员函数?我想这一定意味着调用约定对于 C 和 C++ 代码是相同的,这样才能正常工作 - 可以保证吗?

或者 C++ 代码是否需要与作为指针传递的函数的 C 链接doit,例如

namespace {
  extern "C" {
  void my_function(int i) {
    //...
  }
  }
  void other_function() { 
      doit(my_function);
  }
};
4

3 回答 3

2

据我所知(以及对于常见类型的处理器架构),只要该函数是“自由函数”或“静态成员函数”,它在 C++ 和 C 中将具有相同的调用约定。它只是命名约定随该类型的函数而变化。当您将一个函数作为参数传递给另一个函数时,它不会使用函数的名称(即在立即编译之外)来确定它是哪个函数 - 它只是该点的函数地址。

所以做你的第一个选择应该很好。

于 2013-06-20T12:05:06.613 回答
2

从技术上讲,函数必须具有extern "C"链接才能作为指针传递给期望 C 链接函数指针的函数。话虽如此,我使用过的编译器在没有显式 C 链接的情况下接受全局函数和静态成员函数没有问题。

但是请注意,这extern "C"也会禁用名称修饰。这意味着,尽管您有匿名命名空间,但如果您明确指定extern "C",在不同翻译单元中命名的函数my_function可能会在链接时导致多重定义的符号。

于 2013-06-20T12:17:14.557 回答
-1

当然,如果它不是类函数,则可以。否则,您需要在指针名称中指定类名。

于 2013-06-20T12:04:38.293 回答