指向(非成员)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);
}
};
答案 0 :(得分:2)
据我所知(对于常见的处理器体系结构类型),只要该函数是“自由函数”或“静态成员函数”,它就会在C ++和C中具有相同的调用约定。只有命名约定会随着该类型的函数而改变。当您将函数作为参数传递给另一个函数时,它不使用函数的名称(超出即时编译,即)来确定它是哪个函数 - 它只是该点处函数的地址。
所以做你的第一个选择应该是完全没问题的。
答案 1 :(得分:2)
从技术上讲,该函数必须具有extern "C"
链接才能作为指向期望C-linkage函数指针的函数的指针传递。话虽如此,我使用的编译器在没有显式C链接的情况下接受全局函数和静态成员函数没有问题。
但请注意,extern "C"
也会禁用名称修改。这意味着,尽管您有匿名命名空间,但如果您明确指定extern "C"
,则在链接时,不同翻译单元中名为my_function
的函数可能会导致多重定义的符号。
答案 2 :(得分:0)
如果它当然不是类功能,你可以。 否则,您需要在指针名称中指定类名。