Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/user-interface/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何调用原型在另一个函数中的函数?_C++_Function Prototypes - Fatal编程技术网

C++ 如何调用原型在另一个函数中的函数?

C++ 如何调用原型在另一个函数中的函数?,c++,function-prototypes,C++,Function Prototypes,为了声明一个函数原型,我们在函数定义之前在外部和顶部声明它 1——我想知道为什么C++允许在其他函数定义的正文中声明原型范围>代码>? 2-如何调用原型位于另一个函数体内的函数 以下是一个例子: #include "stdafx.h" #include <iostream> using namespace std; void Bar() { cout << "Bar..." << endl; void Baz(); } int main(

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

1——我想知道为什么C++允许在其他函数定义的正文中声明<代码>原型范围>代码>? 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;
}
#包括“stdafx.h”
#包括
使用名称空间std;
空条()
{

不能一个函数中的函数原型在另一个函数中不可见,因此您在此处编写的代码无法工作。但是,没有任何东西可以阻止您在
main
中提供另一个函数原型:

int main()
{

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

    void Baz();
    Baz();

    cin.get();

    return 0;
}
话虽如此,编写这样的代码是非常罕见的——如果你想对函数进行原型化,只需在全局范围内进行。在单个函数中定义函数原型是很少见的,而且几乎总是一种错误或极差的编码风格

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

<> >向后兼容。这是合法的C代码,并且历史上C++尽可能地保持与C的兼容性。(C++中有很多不可编译的合法C代码,所以这不是一个硬而快的规则,但它是一个很好的指导哲学。)

  • “为什么不?”函数原型实际上只是函数的声明。C++允许你在不同时间点声明所有类型的对象。允许函数内的函数声明类似于允许声明的特殊情况,因此明确地禁止它在规范中需要额外的VILEGED和潜在的。可能会在一个非常奇怪的案件中伤害某人

  • 可以说,这是一个错误的决定,因为它导致了C++最麻烦的解析

    std::vector<int> x(); // Oops - it's a function prototype!
    
    std::vector x();//哦,这是一个函数原型!
    
    更糟糕的是:

    std::istream input;
    std::vector<int> x(istream_iterator<int>(input), istream_iterator<int>()); // Oops - it's a function prototype!
    
    std::i流输入;
    std::vector x(istream_迭代器(输入),istream_迭代器());//Oops-这是一个函数原型!
    
    通过添加新的大括号初始化语法解决了这一问题:

    std::vector<int> x{}; // Okay, a vector.
    std::vector<int> x{istream_iterator<int>{input}, istream_iterator<int>{}}; // Sure, that's fine too.
    
    std::vector x{};//好的,一个向量。
    向量x{istream\u迭代器{input},istream\u迭代器{};//当然,也可以。
    
    是的。我不想在真实中这样做。但是我只想知道为什么C++允许这个,虽然在函数中使用命名空间和OOPosits的感觉和Pascal一样糟糕。也许这就是原因。Dunn.@ MieleldCordC++让你在其他函数内部的原型函数,而不是定义其他函数内的函数。templatetypedef:
    std::vector x();
    你的意思是,对于向量类的这个
    实例化,调用默认的ctor
    被编译器看作是一个返回
    vector
    的函数?@Lee5这实际上不是一个使用默认构造函数的向量实例化,尽管它看起来像一个!相反,它被视为一个名为
    x
    不带参数并返回
    std::vector