서의 공간

c++ 함수안에 함수 정의 본문

C++/정보

c++ 함수안에 함수 정의

홍서의 2021. 1. 19. 18:28

C/C++은 nested subroutine을 지원하지 않습니다. 이는 언어를 간단하게 만들기 위하여 취한 조치라고 볼 수 있겠죠.
말씀하신 것처럼 nested subroutine을 지원하게 될 경우, referencing environment를 설정하기 위해 함수호출시에 상당한 오버헤드가 발생하게 됩니다.
말씀하신 것처럼 main()안에서 fun()을 정의한다고 할때, 다음과 같은 변수 선언이 이루어진다고 하면,

void main()
{

    int i, j; // (1)


    void fun()

    {

        int j; // (2)

        i = 0; // (1)의 i에 값을 할당합니다.

        j = 1; // (2)의 j에 값을 할당합니다.

    }

 

    fun();

}

 

이때, i는 main()내에서 선언된 변수이므로, main()안에 있는 모든 구성요소는 i를 참조할 수 있어야 합니다. 만약, 함수 안에서 함수를 선언하는 것이 가능하다면, main()에서 선언된 변수는 모두 fun()에서도 참조 가능해야 올바른 구성이 됩니다. 그렇게 하려면 컴파일시에 함수에서 참조하는 non-local변수의 주소를 계산하기 위하여 컴파일러 구조가 복잡해지며, 만약 non-local 변수를 shallow access가 아닌 deep access로 참조할 경우엔, 실행속도에도 영향을 미치게 됩니다.

이러한 이유로, 작고 간단한(?) 컴파일러를 지향하는 C는 nested subroutine은 언어 스펙에서 빠지게 되었습니다.

 

그러나 많은 언어가 이러한 nested subroutine을 지원하고 있습니다. 파스칼, 에이다, 알골 등 역사적으로 많은 사용자를 확보했었던 언어들이 그러한 중첩 함수 구조를 지원합니다.

그러나 C에서는 지원하지 않는 부분입니다.

 

c++ 이용해 함수안에서 함수를 정의하는 질문입니다 : 지식iN (naver.com)

'C++ > 정보' 카테고리의 다른 글

optional 예제  (0) 2021.02.03
클래스에 대해  (0) 2021.02.03
std::vector::erase(), std::vector::clear(), std::remove()  (0) 2020.12.16
C++용 XML 설명서  (0) 2020.12.13
vector::resize()와 vector::reserve() 차이  (0) 2020.12.12
Comments