C和c++函数指针是否兼容
Are C and C++ function pointers compatible?
指向(非成员)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
的函数在链接时可能会导致一个多重定义的符号。
如果它不是一个类函数,当然可以。否则,需要在指针名称中指定类名。
相关文章:
- std::vector::迭代器是否可以合法地作为指针
- 是否可以将llvm::FunctionType转换为C/C++原始函数指针
- 返回指向对象的指针的函数调用是否为 prvalue?
- 对象初始化中是否允许指向此成员的指针?
- 新分配指向函数的指针是否合法?
- 在函数结束后使用指向变量的指针是否安全?
- C++默认情况下,指针类型数组的元素是否保证初始化为 nullptr?
- 在对象指针上调用 Delete 是否会递归删除其动态分配的成员
- 如果整数与指针大小相同,则重新解释将整数转换为指针双射是否具有双射作用?
- 是否可以使用函数指针调用虚拟析构函数?
- std::less是否应该允许在编译时比较不相关的指针?
- 是否允许编译器省略对指针的 &* 运算符的组合调用?
- 将相同共享指针的副本存储在不同的向量中是否是一种好的做法?
- C++ 返回指向函数内定义的静态数组的指针是否有效?
- 检查输入 std::array 指针数据是否等于某个常量数组
- 成员访问是否在空指针上定义C++?
- 如果只有 std::auto_ptr 可用,我是否仍应该使用智能指针?
- 是否可以使用指针访问变量以避免直接编辑变量?
- 是否可以仅通过将分配的指针地址存储在C++中来分析内存?
- "this"指针的值在对象的生存期内是否恒定?