함수에 대한 질문....
글쓴이: 익명 사용자 / 작성시간: 토, 2002/07/06 - 11:59오전
안녕하세요..
함수를 쓸때..
void 함수이름(인자들)
{
.....
}
이런식으로 쓰잖아요.. 근데..
void 함수이름(aa)
int aa;
{
}
void 함수이름(int aa)
{
}
위 두개 함수의 차이점이 궁금합니다.
다른분들께 물어보니까.. 그냥 똑같다고는 하는데요..
혹시나 해서.. 뭔가 차이점이 있을거 같아서 이렇게 질문 올립니다.
차이점이 없다면.. "차이점 없음!" 이라는 답변이라두 해주세요.ㅜ.ㅜ
Forums:
Re: 함수에 대한 질문....
음.. 차이가 있다고도 없다고도 말할 수 있져.
코드 하나 만들어 봅니다.
void func1(aa)
int aa;
{
}
void func2(int aa)
{
}
main()
{
func1();
func2();
}
이거 컴파일 해 보심 func1()에서는 에러없이 넘어가지만
func2()에서는 에러 납니다.
func1()은 옛날 C (K&R) 방식임다.
이 경우 컴파일러는 함수의 프로토타입 중 아규먼트 리스트에
대해서 아무런 정보를 가지고 있지 않은 것으로 됩니다.
따라서 파라메터를 주건, 안주건, 여러개 주건 컴파일러에서는
신경을 안 씁니다.
func2()의 경우는 ANSI C 방식임다.
이 경우 컴파일러는 함수의 프로토타입 중 아규먼트 리스트에
대한 정보도 가지고 있으면서 이후 컴파일시 그 함수를 만나면
파라메터 체킹(파라메터수, 타입호환성)을 하며,
이미 선언된(정의는 선언을 수반합니다.) 함수 프로토타입과
틀리기 때문에 오류를 발생시킵니다.
그럼, 함수의 정의나 선언이 함수 사용시까지 안 나오게 되면?
컴파일러는 일단 그 함수의 리턴값이 int 라고 가정합니다.
아규먼트에 대해서는 아무런 가정을 하지 않습니다.
위의 소스에서 func1()과 func2()의 정의를 main() 함수 뒷쪽으로
가져가면 어떻게 될까여?
답은 func1() 컴파일할 때 리턴타입이 틀리다고 에러를 냅니다.
컴파일하면서 함수 정보가 없으니 int를 리턴한다고 가정했는데,
실제 함수를 만나보니 void 리턴이니 프로토타입이 안맞는 오류를
내는거져.
지송함다. 지금 확인해 보니 gcc는 오류가 아니라 경고를 내는군여.
십수년전 터보C 에서는 오류를 냈었슴다. 믿어주십셔.
그럼 func1()과 func2()의 정의를 main()함수 뒷쪽으로 가져가면
어케될까여? 함 해 보시기 바람돠.
C++에서는 함수를 쓸 때 그 함수의 프로토타입을 모르면
에러남돠. C에서는 없어도 걍 아까 말씀드린대로 가정하고 지나감돠.
미리 프로토타입 써주는 게 좋은 습관이라고 함돠.
그리고 말씀하신 두 가지 방식 중에는 void func2(int aa);
와 같은 형태가 타입 체킹(파라메터 숫자도 검사해 주는데)을
가능하게 해 주기 때문에 좋은 방식이라고 함돠.
머, 이런 문제만 아니라면 두 방식 모두 같은 효과를
얻을 수 있으니 같다고 우겨도 꼭 틀리다고 할 수는 없겠져.
즐프 하시기 바람돠!
미뉘 wrote..
안녕하세요..
함수를 쓸때..
void 함수이름(인자들)
{
.....
}
이런식으로 쓰잖아요.. 근데..
void 함수이름(aa)
int aa;
{
}
void 함수이름(int aa)
{
}
위 두개 함수의 차이점이 궁금합니다.
다른분들께 물어보니까.. 그냥 똑같다고는 하는데요..
혹시나 해서.. 뭔가 차이점이 있을거 같아서 이렇게 질문 올립니다.
차이점이 없다면.. "차이점 없음!" 이라는 답변이라두 해주
세요.ㅜ.ㅜ
Re: 함수에 대한 질문....
아래 링크 설명 참조하세요.
http//myhome.hananet.net/~toto2001/Lectures/C_FAQ/Declarations%
20and%20Initializations/1_1.htm
주소창에 복사해서 붙이기 하세요.
댓글 달기