在函数内重新声明函数
Redeclaring a function inside a function
我偶然发现了一个奇怪的 c++ 片段。我认为这是糟糕的代码。为什么有人会在函数中重复函数声明?它甚至可以在更改类型签名以unsigned int sum(int, int)
生成预期结果 4294967294j 时进行编译。为什么这甚至编译?
#include <iostream>
#include <typeinfo>
using namespace std;
int sum(int a, int b){
return a + b;
}
int main()
{
int sum(int, int); // redeclaring sum???
int a = -1;
auto result = sum(a, a);
cout << result << typeid(result).name() << endl;
}
编辑:它为我编译...但它C++代码有效吗?如果不是,为什么编译器(mingw 4.8.1)允许它?
有时在块作用域内重新声明函数是有意义的。例如,如果要设置默认参数。请考虑以下代码
#include <typeinfo>
using namespace std;
int sum(int a, int b){
return a + b;
}
int main()
{
int sum(int, int = -1 ); // redeclaring sum???
int a = -1;
auto result = sum(a, a);
cout << result << typeid(result).name() << endl;
result = sum(a);
cout << result << typeid(result).name() << endl;
}
另一种情况是,当您想从一组重载函数中调用具体函数时。考虑以下示例
#include <iostream>
void g( int ) { std::cout << "g( int )" << std::endl; }
void g( short ) { std::cout << "g( short )" << std::endl; }
int main()
{
char c = 'c';
g( c );
{
void g( short );
g( c );
}
}
如果这是实际的代码,就没有理由这样做。
但是,如果函数sum
是在其他地方定义的,则main
中的声明使其只能在main
内部访问。您不能在该翻译单元的其他任何地方使用它(除非您当然声明它)。因此,这是一种将可见性限制在需要的地方,但是,当然,它的可读性不是很强。
关于更改返回类型 - 这是非法的。您没有看到任何问题 unsigned int
,但如果您尝试
char sum(int, int); // redeclaring sum???
你会看到那里有问题。
相关文章:
- Visual Studio中的函数声明和函数定义问题
- 为什么函数声明中允许 const?
- 如果 x.h 仅由函数声明组成,为什么有必要在 x 中包含 x.h.cpp
- * 和 ** 在 C++ 函数声明中是什么意思?
- 构造函数/函数声明参数列表中的统一初始化
- 在将函数声明为友元时,尖括号的含义是什么?
- 为什么转换函数声明不需要至少一个定义类型说明符
- 如何正确编写指针函数声明?
- 在"template"和函数声明之间使用:template<typename trait> using tr = base_trait<trait> void fn(tr::t
- 为什么要将函数声明和定义放在单独的文件中
- 为什么系统日志有两个不同的函数声明?
- 我如何获取数组的大小,以便我可以从函数声明所述数组
- 使用 enable_if 在按值传递与按引用传递之间更改函数声明
- JavaScript 中的一等函数和 C++ 中的函数声明
- C++ 通过函数声明后初始化向量
- VS2017 #error: : snprintf 的宏定义与标准库函数声明冲突
- C++ 17 个友元函数声明和内联命名空间
- MSVC 2017 - 错误 - 如何将模板类 X 的模板成员函数声明为嵌套类 X::Y 的好友
- 将派生类的构造函数声明为父类的友元
- 用于从 ANSI 字符串转换为 std::basic_string <TCHAR>的正确函数声明