我找到了一本书,指出如果你想使用C标准库中的函数,它将函数指针作为参数(例如qsort),你想要传递函数指针的函数需要是一个C函数因此声明为extern"C".
例如
extern "C" {
int foo(void const* a, void const* b) {...}
}
...
qsort(some_array, some_num, some_size, &foo);
Run Code Online (Sandbox Code Playgroud)
如果这只是错误的信息,我不会感到惊讶,但是 - 我不确定,所以:这是正确的吗?
这是不正确的信息.
extern C需要将C++库链接到C二进制文件时需要; 它允许C链接器查找函数名称.这不是函数指针的问题(因为函数未在C代码中通过名称引用).
很大程度上取决于您是否对目前正在使用的编译器的实际答案感兴趣,或者您是否关心涵盖所有可能符合C++的实现的理论答案.理论上这是必要的.实际上,你通常可以没有它.
真正的问题是你的编译器是否使用不同的调用约定来调用全局C++函数,而不是调用C函数.大多数编译器使用相同的调用约定,因此调用将在没有extern "C"声明的情况下工作.
虽然标准不保证,但理论上可能有一个编译器使用不同的调用约定.至少随便,我不知道这样的编译器,但考虑到周围的编译器数量,如果有一个我不知道的东西,我不会感到惊讶.
OTOH,它确实提出了另一个问题:如果你正在使用C++,你为什么要使用qsort?在C++中,std::sort几乎总是更好 - 更容易使用,通常也更快.