2016-11-29 9 views
2

함수 프로토 타입을 선언하려면 함수 정의 바로 앞에 의미있는 바깥쪽에 선언해야합니다.프로토 타입이 다른 함수 내에서 범위가 지정된 함수를 호출하는 방법은 무엇입니까?

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

하나 개의 함수 내부의 함수 프로토 타입이 다른 내부의 보이지 않는, 그래서 당신이 여기에 작성한 코드가 작동하지 않습니다 여기

은 예입니다. 그러나 main의 내부에 다른 함수의 프로토 타입을 제공에서 당신을 중지 아무것도 없다 :

말한 갖는
int main() 
{ 

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

    void Baz(); 
    Baz(); 

    cin.get(); 

    return 0; 
} 

, 그것은 다음과 같은 코드를 작성하는 매우 이례적인은 - 당신이 기능을 프로토 타입을 의미하는 경우, 단지 전역 범위에서 그렇게 . 함수 프로토 타입이 개별 함수 내부에서 정의 된 것을 보는 것은 드뭅니다. 거의 항상 실수이거나 극히 빈약 한 코딩 스타일입니다.

C++는 두 가지 이유에 대해이 작업을 할 수 있습니다 : 역 호환성

  1. . 이것은 합법적 인 C 코드이며, 역사적으로 C++은 가능할 때마다 C와의 호환성을 유지하려고 시도했습니다. (C++로 컴파일되지 않는 많은 합법적 인 C 코드가 있으므로, 이것은 어렵고 빠른 규칙은 아니지만 좋은 지침 철학입니다.)

  2. "왜 안되나요?" 원리. 함수 프로토 타입은 실제로 함수의 선언입니다. C++을 사용하면 다양한 시점에 여러 종류의 객체를 선언 할 수 있습니다. 함수 내부에서 이와 같은 함수 선언을 허용하는 것은 선언을 허용하는 특수한 경우로 이어 지므로 명시 적으로 허용하지 않으면 스펙에 여분의 verbage가 필요하고 잠재적으로 기괴한 경우에 누군가를 해칠 수 있습니다.

아마도 C++의 Most Vexing Parse로 연결되기 때문에 이것은 잘못된 결정이었습니다.

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. 
+0

예. 나는 진짜로 그렇게하고 싶지 않다. 하지만 C++에서 허용하는 이유는 무엇입니까? 범위 지정에는 네임 스페이스와 OOP가 있습니다. – Lee5

+0

@ Lee5 방금 답변을 업데이트했습니다! – templatetypedef

+0

함수 내의 함수는 Pascal과 매우 흡사합니다. 어쩌면 이것이 이유 였을까요? 던노. –