허허초보 님이 쓰신 글 :
: 아래와 같이 컴파일을 하면 정상적으로 컴파일 완료가 됩니다
: 에러가 있으면 당연히 컴파일이 안되고요.
: 경보(Warning) 가 있어도 컴파일 되는 이유를 알고 싶네요;;
: <질문>
: 1. 에러와 워닝에 대한 이해를 부탁드립니다.
: 2. 그리고 워닝 메세지를 안뜨게 하고 싶은데
: 아래 소스를 어떻게 고치면 될까요?
: 3. 8070에러는 리턴을 넣어주면 되겠지요.
: 그러면 8065에러는 어떻게 하면 될까요?
: 4. 컴파일 할때 리턴은 자동으로 삽입되는것인가요?
: 5. 터보 C 컴파일러에 대한 구조를 설명 부탁드립니다.
: ####################################################################################
: include <stdio.h>
: main()
: {
: int a=3, b=5;
: printf("호출전 a = %d, b = %d\n", a, b);
: swap(&a, &b);
: printf("호출후 a = %d, b = %d\n", a, b);
: }
:
: swap(int * x, int * y)
: {
: int temp;
: temp = * x;
: * x = * y;
: 1* y = temp;
: printf("함수내의 x = %d, y = %d\n", * x, * y);
: }
:
: #####################################################################################
: ---------- compile ----------
: Borland C++ 5.5.1 for Win32 Copyright (c) 1993, 2000 Borland
: C:\C\Noname5.c:
: Warning W8065 C:\C\Noname5.c 6: Call to function 'swap' with no prototype in function main
: Warning W8070 C:\C\Noname5.c 8: Function should return a value in function main
: Warning W8070 C:\C\Noname5.c 17: Function should return a value in function swap
: Turbo Incremental Link 5.00 Copyright (c) 1997, 2000 Borland
:
: 출력 완료 (0초 경과) - 정상 종료
: #####################################################################################
경고와 에러의 차이는 쉽게 경고는 무시하고 진행해도 실행이 됩니다. ㅋㅋ 에러는 진행자체가 안되겠지요.. 에러니까..
말그대로 에러는 뭔가 틀렸다는 얘기입니다. 경고는 틀린것은 아니지만 오해의 소지나 잘못될 가능성이 있다는 신호입니다.
처음의 경고 메시지 65는 'swap'라는 함수가 선언없이 사용되었다는 것입니다. 메인함수에서 함수를 사용하기에 앞서서(여기서는 메인함수보다 먼저) 정의하거나 사용하기 전에 함수원형(프로토타입)을 적어주시고 나중에 정의를 하면 됩니다. 원형을 선언한다는 것은 어딘가에 정의되어 있는 것을 사용하겠다라고 알려주는 역할을 하는 것입니다. 컴파일 상황에선 형선언부분만 체크하고 넘어가고, 컴파일이 끝난다음 링크시에 실제로 정의를 찾습니다. 이 때 찾을 수 없다면(정의되지 않았다면) 링크 에러가 나게 됩니다. (분명 있다고 했는데, 찾아봐도 없다고 불평합니다..ㅋㅋ)
두번째와 세번재 경고 메시지 70은 함수원형은 main()과 swap()이기 때문에 int 가 생략되어진 형태라고 int main(), int swap()라고 생각합니다. 그래서 int 형태의 값이 돌아올 것이다 라고 기대하는데 실제 함수 정의에서는 리턴값이 없습니다. 그래서 발생합니다. 리턴값을 안주네 하면서 불평하는 것입니다.
원문에 적어주신 대로 제일 마지막에 return; 하시던지, void 키워드를 사용하여 원형을 명확히 적어주시면 됩니다. void main(void), void swap(void) 이런 식으로 인자와 리턴값을 명확하게 적어주면 경고 메시지 나오지 않습니다.
(Turbo C 2.0 쓰시는 분들은 void라는 키워드 자체가 없는거 아시죠? void는 C++의 키워드 입니다.)
더 기술적은 내용은 더 고수님들께 패쓰 입니다. ^^*
|