C++ C++;重新声明不一致性/趣味性

C++ C++;重新声明不一致性/趣味性,c++,function,standards,header-files,redeclaration,C++,Function,Standards,Header Files,Redeclaration,当我想到这个例子时,我正在回答: #include <iostream> void func(int i); void func(); int main (){ func(); return 0; } void func(){} 我预计两次都会出现这样的错误 我对代码做了一些修改,出于一些完全奇怪的原因,链接器似乎完全忽略了不正确的声明。现在,这允许一些非常奇怪的代码。例如,此头文件是合法的: #ifndef EXAMPLE #define EXAMPLE vo

当我想到这个例子时,我正在回答:

#include <iostream>

void func(int i);
void func();

int main (){
    func();
    return 0;
}
void func(){}
我预计两次都会出现这样的错误

我对代码做了一些修改,出于一些完全奇怪的原因,链接器似乎完全忽略了不正确的声明。现在,这允许一些非常奇怪的代码。例如,此头文件是合法的:

#ifndef EXAMPLE
#define EXAMPLE
void func();
void func(int a);
void func(int b);
void func(int a, int b);
void func(int a, short b);
void func(int w);
void func(short b);
#endif
为什么??这究竟是为什么?这只是一个C++标准的失败吗?编译器失败?“特色”?实际特征?(顺便说一下,这都是一个问题。)


另外,当我在等待答案的时候,我将在这里利用这一点,在代码中预先添加一些特性,这些特性可能最终会进入生产

第一个是函数重载,不考虑参数名称(参数类型或其计数不同)


第二种是函数重新声明(参数类型和计数相同),其返回类型的更改是禁止的。不允许仅重载返回类型。编译器告诉你的。

我不明白你在问什么。参数可以重载,但返回类型不能重载。如果您可以在返回类型上重载,则必须有向后流动的信息。在您给出的示例头文件中,对于
void func(int)
,有几个重复的声明,但这不是问题。你的问题是什么?问题是:为什么编译器允许重复的函数声明?在这种情况下,一个潜在的“用途”是在不同的声明中使用不同的默认参数,但这将是非常值得怀疑的。我不知道为什么编译器会允许重复声明。@Justin问题是为什么编译器/链接器会允许许多声明,甚至没有警告。都是一样的功能。嗯。好。因此,这使得混淆变得100%容易。嘎。我将编写我自己的编译器,它不支持这个。即使是
-wall
也允许这样做。畏缩。(我说的是参数名。)@grantgarison您甚至可以只使用类型来声明没有参数名的函数。试试看@格兰特加里森,有人曾经说过,权力越大,责任越大:)
file.cpp:4:5: error: functions that differ only in their return type cannot be
  overloaded
int func();
#ifndef EXAMPLE
#define EXAMPLE
void func();
void func(int a);
void func(int b);
void func(int a, int b);
void func(int a, short b);
void func(int w);
void func(short b);
#endif