C언어에서는 함수를 중첩 정의하는 것을 허용하지 않는다.

예를들어, C언어에서 다음과 같은 함수를 생각해 보자.

#include<stdio.h>

int test(int a){
    printf("a ");
    int nested_test(int b){
        printf("nested");
        return 1;
    }
    return nested_test(1);
}

int main(){
    test(0);
    return 1;   
}

test함수 안에 nested_test함수가 또 정의되어 있다. C언어 표준에서는 이런 함수 정의를 허용하지 않는다. 그러나 GCC의 C컴파일러에서는 허용한다. 위의 프로그램을 실행시키면 a와 nested가 둘 다 나타난다.

def test(a,b):
    print(a)
    print(b)
    def test1(a,b):
        print(a+b)
       
    test1(a,b)
test(1,2)
test1(1,2) # ERROR!!

파이썬에서도 같은 일이 가능하다. 파이썬에서는 중첩 정의를 원래부터 허용한다. 물론, test함수의 바깥쪽에서 test1을 불러오려고 하면 오류가 발생한다. 밖에서는 test1이 안 보이기 때문이다. (Scope 문제)

C언어에 GCC를 사용하는 경우에, 함수포인터를 연결해서 함수 내부에 중첩 정의된 함수를 불러오는 것이 가능은 하다. 단, 가능하다고 해서 해도 된다는 뜻은 아니다. 함수는 호출되는 순간에 연결되었다가 끝나는 순간 모든 작동을 정지하므로 만약 중첩 정의된 함수가 함수의 외부에서 호출되었을 때 모든 일을 마무리짓기 전에 바깥쪽의 함수가 끝나버린다면, 일이 마무리되기 전에 종료되어 오류를 발생시킬 것이다. (안해봤음...)

http://langdev.org/posts/38
http://sparrow.borlandforum.com/board/boardview.asp?table_name=tip&sel=&findit=&srch=&gotopage=7&block=0&board_idx=115&path=N&vir_numm=170&vir_numm2=65
http://discuss.joelonsoftware.com/default.asp?interview.11.431470.11
http://gcc.gnu.org/onlinedocs/gcc/Nested-Functions.html
http://en.wikipedia.org/wiki/Nested_function
by snowall 2011. 6. 2. 17:15