gpt4 book ai didi

c++ - 外部 "C"和 "C++"版本的 qsort()/bsearch() 的重载解析

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:40:47 30 4
gpt4 key购买 nike

在C++中,标准库提供了两个版本的qsort():

extern "C" void qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));
extern "C++" void qsort(void* base, size_t nmemb, size_t size, int (*compar)(const void*, const void*));

bsearch() 大致相同。

我的问题是,调用 qsort() 时重载解析如何工作?它是否根据作为最后一个参数传递的函数指针的链接类型(“C”或“C++”)自动链接到适当的函数?或者调用者需要用某种额外的语法明确指定?

(让我们暂时停止调用 std::sort 的诱惑......)

最佳答案

int (*compar)(const void*, const void*) 参数对于两个不同的重载具有不同的类型。对于第一个重载,它是一个 extern "C" 函数指针参数。对于第二个重载,它是一个 extern "C++" 函数指针参数。您传递给 qsort 的任何函数指针都已经具有某种链接,这就是用来确定调用哪个重载的链接。

引用标准:

7.5 Linkage specifications [dcl.link]

All function types, function names with external linkage, and variable names with external linkage have a language linkage. [...] The default language linkage of all function types, function names, and variable names is C++ language linkage. Two function types with different language linkages are distinct types even if they are otherwise identical.

事实上,我不认为该标准实际上意味着要求两个 qsort 重载确实具有不同的链接。与 C 不同,不允许用户提供标准库函数的声明;它们之间的相关区别是 compar 的类型。他们可以声明为

extern "C" typedef int (*__compar_fnp_c)(const void *, const void *);
extern "C++" typedef int (*__compar_fnp_cxx)(const void *, const void *);
void qsort(void* base, size_t nmemb, size_t size, __compar_fnp_c compar);
void qsort(void* base, size_t nmemb, size_t size, __compar_fnp_cxx compar);

__compar_fnp_c__compar_fnp_cxx 是不同的类型应该更明显。也就是说,as-if 规则不允许此实现,因为它会破坏采用指针或引用 qsort 的代码。

请注意,GCC 以及其他一些编译器没有正确实现这一点,并且没有将链接视为函数指针类型的一部分。在此类实现中,只有一个版本的 qsort 可用,以防止在重载解析期间发生冲突。

关于c++ - 外部 "C"和 "C++"版本的 qsort()/bsearch() 的重载解析,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21955288/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com