지금 Func1부터 호출을 하면 에러가 난다.
이유는 CPP같은 경우 코드를 위에서부터 아래로 하나씩 하나씩
분석을 한다고 보면된다.
지금Func1을 분석을 했는데
Func2를 호출하라고 하니까 모르는 것이다... => 식별자 에러!
그래서 먼저 "전방 선언" 하든가 다른 방법있으면 다른 방법 쓰든가..
아니면 이렇게 거꾸로 선언 해주면 정상적으로 잘 된다.
어셈블리 언어를 볼때 먼저 Func2를 호출하기 위해서 먼저 만들어 주는 부분이...
push 1, push 2 하고나서
call Func2() 를 한다.
이렇게 일련의 코드를 만들어 주어야 하는데
push하는 것까지는 무리 없이 만들어지는데
"call Func2"라는 부분 => 어딘가로 이동을 해야한다는 부분을 만들어
주어야지만 어디로 어디로 타고타고 들어가는데
Func2 가 위치한 주소로 가가지고 함수를 실행할 수 있게 된다.
그래서 Func2라는 녀석의 "존재"에 대해서는 반드시 알아야 한다는 것이다.
그래서 모두가 동의하게끔 "위치"가 중요하다.
구현부는 관심이 없고 먼저 전방선언 해버린다.
(C#은 어디든지 만들어도 잘 찾아준다)
이렇게만 만들어줘도 됨. (근데 가독성은?)
Func1에서도 Func2, Func3를 호출할 수 있을 텐데
나중에 함수가 많아지면
Func3가 호출이 되었는데 어디에서부터 호출 되었는지 찾기가 힘들다...
=>
반환 주소값을 오른쪽에서부터 타고타고 들어가면 찾을 수 있다.
그래서 대부분의 디버거에서
호출 스택 보여준다.
이게 지금 어떤 경로를 통해서 왔는지 보여주는 것이다.