C和C ++函数指针是否兼容?

时间:2013-06-20 12:00:35

标签: c++ c

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

例如

的C代码
void  doit(void (*cb)(int i))
{
     cb(100);
}

可以从C ++代码调用do_it函数(它将具有C链接) 使用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);
  }
};

3 个答案:

答案 0 :(得分:2)

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

所以做你的第一个选择应该是完全没问题的。

答案 1 :(得分:2)

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

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

答案 2 :(得分:0)

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