【问题标题】:How to call a function whose prototype is scoped inside another function?如何调用原型在另一个函数内的函数?
【发布时间】:2016-11-29 18:04:02
【问题描述】:

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

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

【问题讨论】:

    标签: c++ function-prototypes


    【解决方案1】:

    一个函数中的函数原型在另一个函数中是不可见的,因此您在此处编写的代码将不起作用。但是,没有什么能阻止您在 main 中提供另一个函数原型:

    int main()
    {
    
        void Foo();
        Foo();
        Bar();
    
        void Baz();
        Baz();
    
        cin.get();
    
        return 0;
    }
    

    话虽如此,编写这样的代码是非常不寻常的 - 如果您要对函数进行原型化,只需在全局范围内进行即可。在单个函数内部定义函数原型的情况很少见,而且几乎总是一个错误或极差的编码风格。

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

    1. 向后兼容性。这是合法的 C 代码,历史上 C++ 试图尽可能保持与 C 的兼容性。 (有很多合法的 C 代码不能在 C++ 中编译,所以这不是一个硬性规定,但它是一个很好的指导理念。)

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

      李>

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

    【讨论】:

    • 是的。我不想在现实中那样做。但我只是想知道为什么 C++ 允许这样做,尽管范围有命名空间和 OOP
    • 函数中的函数感觉非常像 Pascal。也许这就是原因?不知道。
    • @MichaelDorgan C++ 允许您在其他函数中原型化函数,但不能在其他函数中定义函数。
    • @templatetypedef: std::vector&lt;int&gt; x(); 你的意思是这个instantiate of vector class, calling the default ctor 被编译器视为一个返回vector&lt;int&gt; 的函数?
    • @Lee5 这实际上不是使用默认构造函数的向量的实例化,即使它看起来像一个!相反,它被视为一个名为 x 的函数的原型,该函数不接受任何参数并返回 std::vector&lt;int&gt;
    猜你喜欢
    • 1970-01-01
    • 2011-05-30
    • 1970-01-01
    • 2014-04-04
    • 1970-01-01
    • 2017-09-22
    • 2019-09-11
    • 2015-07-15
    • 2017-05-08
    相关资源
    最近更新 更多