使用指向c ++函数的指针调用qsort

DaV*_*nci 3 c++

我找到了一本书,指出如果你想使用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)

如果这只是错误的信息,我不会感到惊讶,但是 - 我不确定,所以:这是正确的吗?

Oli*_*rth 5

这是不正确的信息.

extern C需要将C++库链接到C二进制文件时需要; 它允许C链接器查找函数名称.这不是函数指针的问题(因为函数未在C代码中通过名称引用).

  • 然后,作为评论发布的链接@thomi也说:"它实际上必须是一个外部的"C"非成员函数是正确的,因为"C链接"不仅涵盖名称修改等内容,而且还调用约定,这可能在C和C++之间有所不同.在[33.2]或者我有误解吗? (3认同)

Jer*_*fin 5

很大程度上取决于您是否对目前正在使用的编译器的实际答案感兴趣,或者您是否关心涵盖所有可能符合C++的实现的理论答案.理论上这是必要的.实际上,你通常可以没有它.

真正的问题是你的编译器是否使用不同的调用约定来调用全局C++函数,而不是调用C函数.大多数编译器使用相同的调用约定,因此调用将在没有extern "C"声明的情况下工作.

虽然标准不保证,但理论上可能有一个编译器使用不同的调用约定.至少随便,我不知道这样的编译器,但考虑到周围的编译器数量,如果有一个我不知道的东西,我不会感到惊讶.

OTOH,它确实提出了另一个问题:如果你正在使用C++,你为什么要使用qsort?在C++中,std::sort几乎总是更好 - 更容易使用,通常也更快.

  • 不过,`qsort`可能很特别.C++标准要求`qsort`,`bsearch`和`atexit`*必须由具有"C++"链接*以及*"C"链接的实现声明.对于其他标准C函数,它的实现定义了它们具有的链接.我不知道这是什么意图或影响,我还没有看到任何说明这是否对函数指针参数有影响,但这些标准C函数采取回调并不是巧合,在C++中有这个额外的要求. (2认同)