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

How to call a function whose prototype is scoped inside another function?

本文关键字:函数 另一个 范围内 原型 何调用 调用      更新时间:2023-10-16

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

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

一个函数在一个函数内部在另一个函数中不可见,因此您在此处编写的代码无法正常工作。但是,没有什么可以阻止您在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.