Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/meteor/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 是否可以使用外部链接重载函数?_C++_Function_Linkage - Fatal编程技术网

C++ 是否可以使用外部链接重载函数?

C++ 是否可以使用外部链接重载函数?,c++,function,linkage,C++,Function,Linkage,我在声明中看到了一个奇怪的代码: 我猜这是某种函数重载,但它显然是错的 是什么?为什么有必要这样做?来源的问题 这有点误导 使用不同的存储类说明符声明同一函数两次是非法的,并且是错误的。如果您查看libstdc++(GCC的标准库实现)的源代码,您将看到这一点 《标准报》对此有何看法 尽管[C++11:18.5]列出了这两个声明,正如cppreference一样,这并不意味着这两个声明都可以在单个实现中使用;这意味着一个实现可以选择声明其中一个:也就是说,它解释了[C++11:17.6.4.3

我在声明中看到了一个奇怪的代码:

我猜这是某种函数重载,但它显然是错的

是什么?为什么有必要这样做?

来源的问题 这有点误导

使用不同的存储类说明符声明同一函数两次是非法的,并且是错误的。如果您查看libstdc++(GCC的标准库实现)的源代码,您将看到这一点


《标准报》对此有何看法 尽管
[C++11:18.5]
列出了这两个声明,正如cppreference一样,这并不意味着这两个声明都可以在单个实现中使用;这意味着一个实现可以选择声明其中一个:也就是说,它解释了
[C++11:17.6.4.3.3/4]
,其中说明:

使用外部链接声明的标准C库中的每个函数签名保留给实现,以用作带有外部“C”和外部“C++”链接的函数签名[…]

此外:

[C++11:17.6.2.3/2]:
使用外部链接声明的C标准库中的名称是否具有
extern“C”
extern“C++”
链接是实现定义的。为此,建议实现使用
extern“C++”
链接

规则在此处明确规定:

[C++11:7.5/5]:
如果两个声明声明将具有相同名称和参数类型列表(8.3.5)的函数声明为相同名称空间的成员,或者将具有相同名称的对象声明为相同名称空间的成员,并且声明给出了不同语言链接的名称,则程序格式错误;如果声明出现在不同的翻译单元中,则不需要进行诊断。[……]


为什么这会令人困惑 在我看来,这确实在标准范围内的其他地方造成了一些问题;例如:

[C++11:25.5/2]:
内容与标准C库标题相同,但有以下例外:

[C++11:25.5/3]:
函数签名:

bsearch(const void *, const void *, size_t, size_t,
        int (*)(const void *, const void *));
替换为两项声明:

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

extern "C++" void *bsearch(const void *key, const void *base,
                           size_t nmemb, size_t size,
                           int (*compar)(const void *, const void *));
它们都具有与原始声明相同的行为


我想你看不到这样的代码。由于C++标准

,至少有可能与<> > > >的预处理器指令类似,如果或>IFIFF < /代码>将这两个声明分开。
5如果两个声明将具有相同名称和参数类型列表(8.3.5)的函数声明为同一名称空间的成员,或将具有相同名称的对象声明为同一名称空间的成员,并且声明给出了不同的语言链接,则程序格式错误如果声明以不同的翻译单位出现,则不需要诊断。除了具有C++链接的函数之外,没有链接规范的函数声明不应在该函数的第一个链接规范之前。在看到显式链接规范后,可以在没有链接规范的情况下声明函数;先前声明中明确指定的链接不受此类函数声明的影响。

这是非法的,并会导致错误:@Deduplicator Hummm的可能重复项。。。但我甚至看到标准版也这么说@user2485710不,这是不同的问题-仔细看。@user2485710:甚至不接近,但我在标准页面中也看到了。嗯?你能详细解释一下吗?7.5[dcl.link]§5也很重要。@Deduplicator:Heh,字面意思是刚刚发现:)@ikh:我正在为你免费提供尽可能好的答案。
extern "C" void *bsearch(const void *key, const void *base,
                         size_t nmemb, size_t size,
                         int (*compar)(const void *, const void *));

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