声明一个函数原型,我们将它声明在外部和顶部,这意味着在函数定义之前。
1-我想知道为什么c ++允许在其他函数体内声明prototypes scoped
'定义
2-如何调用原型在另一个函数体内的函数?
这是一个例子:
#include "stdafx.h"
#include <iostream>
using namespace std;
void Bar()
{
cout << "Bar..." << endl;
void Baz();
}
int main()
{
void Foo();
Foo();
Bar();
Baz(); // how to call this function?
cin.get();
return 0;
}
void Foo()
{
cout << "Foo..." << endl;
}
void Baz()
{
cout << "Baz..." << endl;
}
答案 0 :(得分:1)
一个函数内部的函数原型在另一个函数内部不可见,因此您在此处编写的代码将无法正常工作。但是,没有什么能阻止你在main
内提供另一个函数原型:
int main()
{
void Foo();
Foo();
Bar();
void Baz();
Baz();
cin.get();
return 0;
}
有人说,编写这样的代码是非常不寻常的 - 如果你的意思是对函数进行原型设计,那么就在全球范围内这样做。很少见到在各个函数中定义的函数原型,并且几乎总是错误或编码风格极差。
C ++允许这样做有两个原因:
向后兼容性。这是合法的C代码,历史上C ++试图尽可能保持与C的兼容性。 (有很多合法的C代码不能用C ++编译,所以这不是一个严格的规则,但它是一个很好的指导思想。)
“为什么不呢?”原理。函数原型实际上只是函数的声明。 C ++允许您在不同的时间点声明各种对象。在函数内部允许这样的函数声明作为允许声明的特殊情况,因此明确禁止声明将需要规范中的额外verbage并且可能在某个非常奇怪的情况下伤害某人。
可以说,这是一个糟糕的决定,因为它导致了C ++的最令人烦恼的解析。例如,以下代码行被解释为函数原型:
std::vector<int> x(); // Oops - it's a function prototype!
更糟糕的是这样的事情:
std::istream input;
std::vector<int> x(istream_iterator<int>(input), istream_iterator<int>()); // Oops - it's a function prototype!
通过添加新的大括号初始化语法来解决这个问题:
std::vector<int> x{}; // Okay, a vector.
std::vector<int> x{istream_iterator<int>{input}, istream_iterator<int>{}}; // Sure, that's fine too.