Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/149.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/277.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函数时引发的编译器时间错误_C++_C - Fatal编程技术网

C++ 为什么不是';调用C函数时引发的编译器时间错误

C++ 为什么不是';调用C函数时引发的编译器时间错误,c++,c,C++,C,根据标准在N4296::13.3.3[over.match.best] namespace A { extern "C" void f(int = 5); } namespace B { extern "C" void f(int = 5); } using A::f; using B::f; void use() { f(3); // OK, default argument was not used for viability f(); // Er

根据标准在
N4296::13.3.3[over.match.best]

namespace A 
{
    extern "C" void f(int = 5);
}

namespace B 
{
    extern "C" void f(int = 5);
}

using A::f;
using B::f;

void use() 
{
    f(3); // OK, default argument was not used for viability
    f(); // Error: found default argument twice
}
正如标准在
N4296::7.5/6[dcl.link]
中所述:

一个函数的两个声明与C语言的链接相同 函数名(忽略限定它的名称空间名) 出现在不同的命名空间范围中,引用同一函数

我试着用我自己的例子来探讨这样一件事:

#include <iostream>

namespace A
{
    extern "C" void foo(int a = 5){ std::cout << a << "1" << std::endl; }
}

namespace B
{
    extern "C" void foo(int a = 5);
}

using A::foo;
using B::foo;

int main()
{ 
    foo(); //Error 
    foo(2);
}
#包括
名称空间A
{

extern“C”void foo(inta=5){std::cout正如评论中已经提到的,标准的示例和您的示例之间没有相关的区别。正确实现标准的编译器会对两者进行诊断

这显然是一个编译器错误,至少在clang和Intel中是这样,当您将示例编辑到荒谬的地方时,就可以看到这一事实

namespace A
{
    extern "C" void f(int = 5);
}

namespace B
{
    extern "C" void f(int = 3); // different default argument
}

using A::f;
using B::f;

void use()
{
    f(); // No error !
}
尽管得到两个不同的默认参数,但不会生成错误或警告。使用了其中一个默认参数,第一个用于Intel,第二个用于clang


GCC确实拒绝了这个毫无意义的示例,因此没有快速简便的方法来验证它是否也是GCC中的一个bug,但这并没有改变事实:如前所述,它默默地接受了标准中的示例,其中标准指出了应该检测错误的位置。

我只是好奇m是什么“C++”命名空间中的<代码>外部“C”<代码>函数。RE:“除非我在A命名空间中明确定义了函数,否则我的示例和标准的示例有什么不同?”:我只是尝试编辑你的演示,以不明确地定义函数,而且它仍然编译得很好。(链接失败了。)这不是区别。在这种情况下,g++似乎没有给出错误。嗯……顺便说一句,你的问题中遗漏了规范的一个重要部分:“如果最佳可行函数解析为找到多个声明的函数,并且如果这些声明中至少有两个声明(或者在使用声明的情况下它们引用的声明)指定了使函数可行的默认参数,则程序的格式错误。“听起来像是一个CLAG和G+缺陷?”J.J. Z. WikC:它允许你从一个库中访问函数,而不会与C++代码中其他地方使用的标识符冲突。这看起来像是一个标准错误的情况,所以实现忽略了它。(显然,除了不合规之外)。