3.5) 프로시저(procedure)
잘 알고 있듯이 main 프로시저의 본체에만 코드를 작성하면 가독성과 생산성이 아주 나빠지므로, 가능한 한 프로시저를 역할 별로 분리하는 것이 좋다. CIL에서도 여러 개의 프로시저를 사용자가 정의하고 호출할 수 있다.
Procedure.c |
#include "../CIL/CIL.h" STRING sHello = "Hello, procedure!";
// 프로시저 hello를 정의합니다. PROC(hello)
PUSH(sHello); INVOKE(print_str)
ENDP
// main PROC(main)
// hello 프로시저를 호출합니다. INVOKE(hello)
ENDP |
여기에는 흥미로운 사실 하나가 더 있는데, 같은 파일 내부라면 순서를 생각할 필요 없이 프로시저를 정의하고 호출할 수 있다는 것이다. 즉 다음은 적법한 코드이다.
Procedure.c |
#include "CIL.h" STRING sHello = "Hello, procedure!";
// main PROC(main) // hello 프로시저를 호출합니다. INVOKE(hello) ENDP
// 프로시저 hello를 정의합니다. PROC(hello)
PUSH(sHello); INVOKE(print_str)
ENDP |
정상적인 C 프로젝트를 만들었음에도 불구하고 이것이 지원되지 않는다면, 컴파일러가 내부적으로 이를 지원하지 않을 가능성이 있다. 이 경우 호출 전, 즉 코드의 위 부분에 다음과 같이 적는다.
PROTO(<procedure_name>); // ex) PROTO(hello);
참고로 이 경우 컴파일러가 오류를 뱉는 건, 컴파일러가 최신 표준을 잘 지키고 있기 때문이다. 구형 C에서는 암묵적인 함수 호출이 표준에 있었지만, C99 표준 이후로는 모두 금지되어있다. Visual Studio 2013은 이것이 가능한 개발 도구 중의 하나인데, 이유는 하위 호환 때문이니 결코 Visual Studio가 다른 컴파일러보다 우수하거나, 다른 컴파일러가 뒤떨어지는 것으로 오해하는 일이 없었으면 좋겠다.