45

在我对这个问题的回答之后,在 C++11 和 C++14 中:

[C++11, C++14: 25.5/2]:内容与标准 C 库头文件相同,但<stdlib.h>有以下例外:

[C++11, C++14: 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++11, C++14: 7.5/5]:如果两个声明将具有相同名称和参数类型列表(8.3.5)的函数声明为同一命名空间的成员,或者将具有相同名称的对象声明为同一命名空间的成员,并且声明赋予名称不同的语言链接,程序格式错误;如果声明出现在不同的翻译单元中,则不需要诊断。[..]

这是缺陷吗?

4

1 回答 1

49

但参数类型列表不一样。一种compar是指向具有“C”语言链接的函数的指针,另一种是指向具有“C++”语言链接的函数的指针。

C++11, 7.5 规定:

1 ...具有不同语言链接的两个函数类型是不同的类型,即使它们在其他方面相同。

4 在链接规范中,指定的语言链接适用于所有函数声明符的函数类型、具有外部链接的函数名以及链接规范中声明的具有外部链接的变量名[示例:

extern "C" void f1(void(*pf)(int));
// the name f1 and its function type have C language
// linkage; pf is a pointer to a C function

7.5/1 和 7.5/5 之间看似不一致的问题在意识到 1 谈论函数类型而 5 谈论函数名称时得到了解决。

于 2014-10-02T12:57:46.953 回答