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

Are C and C++ function pointers compatible?

本文关键字:是否 指针 函数 c++      更新时间:2023-10-16

指向(非成员)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);
  }
};

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

所以执行第一个选项应该是完全没问题的。

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

注意,extern "C"也禁用名称混淆。这意味着尽管使用了匿名名称空间,但如果明确指定了extern "C",那么在不同的翻译单元中名为my_function的函数在链接时可能会导致一个多重定义的符号。

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