如何调用其原型在另一个函数范围内的函数?

时间:2016-11-29 18:04:03

标签: c++ function-prototypes

声明一个函数原型,我们将它声明在外部和顶部,这意味着在函数定义之前。

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;
}

1 个答案:

答案 0 :(得分:1)

一个函数内部的函数原型在另一个函数内部不可见,因此您在此处编写的代码将无法正常工作。但是,没有什么能阻止你在main内提供另一个函数原型:

int main()
{

    void Foo();
    Foo();
    Bar();

    void Baz();
    Baz();

    cin.get();

    return 0;
}

有人说,编写这样的代码是非常不寻常的 - 如果你的意思是对函数进行原型设计,那么就在全球范围内这样做。很少见到在各个函数中定义的函数原型,并且几乎总是错误或编码风格极差。

C ++允许这样做有两个原因:

  1. 向后兼容性。这是合法的C代码,历史上C ++试图尽可能保持与C的兼容性。 (有很多合法的C代码不能用C ++编译,所以这不是一个严格的规则,但它是一个很好的指导思想。)

  2. “为什么不呢?”原理。函数原型实际上只是函数的声明。 C ++允许您在不同的时间点声明各种对象。在函数内部允许这样的函数声明作为允许声明的特殊情况,因此明确禁止声明将需要规范中的额外verbage并且可能在某个非常奇怪的情况下伤害某人。

  3. 可以说,这是一个糟糕的决定,因为它导致了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.