예전에 비슷한 경험을 해본 적이 있습니다.... 까먹고 프로토타입을 선언 안 해줬더니.. 실수 값이 뭘 집어넣어도 0이 나오더군요...-_-
디버거로 하나하나 쫓아가서... 봐도
분명히 로컬변수값은 1.2얼마얼마인데... 함수 안에 들어가면
0이 되어있고...
-_-결국은 디스어셈블 해서...-_-알아냈다는...
사실 이런 실수는 -Wall 옵션을 붙여서 컴파일하면 금방 알아낼 수 있죠....
혹시 위에 설명이 되었나 안 되었나 못봤지만...
그냥 이유를 설명해드리면...
prototype 선언을 안 해놓으면... 기본으로 리턴값과 모든 파라메터는 int라고 생각합니다... 당연히 호출하는 쪽에서는 이를 int로 캐스팅하고... 받는쪽에서는 제대로 받지를 못하고.....
게다가 특별히 옵션을 안 걸어놓으면 워닝도 하나도 안 뜨고...
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
-Wall All of the above `-W' options combined. These are
all the options which pertain to usage that we rec-
ommend avoiding and that we believe is easy to
avoid, even in conjunction with macros.
간단히 말해서 warning 이 발생할 수 있는 모든 경우에 warning 출력을 해주라는 것입니다.
보통 모든 경우에 대해 warning 이 켜지지 않았는데, 위 옵션을 주면 모든 Warning에 대해 출력을 해줍니다.
%lf 가 아니라 %f 아닌가...그럼 수고요..
%lf 가 아니라 %f 아닌가...
그럼 수고요..
안되네요
안되는군요..
해결했습니다.
math.h를 include하니까 해결되는군요
근데 전 컴파일할때 -lm옵션 붙이고 저 파일은 포함하지 않았는데도
log함수를 에러없이 컴파일했는데 왜 그런거죠??
stdio.h를 포함하지 않아도 printf를 쓸수있는건 왜그런건가요?
제 생각엔...
-lm 옵션을 줌으로써 함수의 실제 구현 부분을 찾을수는 있었지만, math.h 를 include 하지 않아
함수의 프로토타입은 제공되지 않았습니다.
보통 헤더파일을 include 하지 않아도 에러없이 컴파일은 할 수 있습니다.
하지만, 함수의 프로토타입을 제공하지 않은 경우에는 함수의 리턴값이나 인자등의 형식을 알 수 없어
이 경우 C 에서는 int 로 가정한다고 들었습니다.
따라서 log10 함수의 리턴 값을 int 형으로 가정하므로 그것때문에 그런 현상이 발생한 것 같습니다.
우연히 이 형식이 맞거나 printf 같이 리턴값을 받지 않는 경우 큰 문제가 없겠지만, 그렇지 않은 경우에는
원하는 대로 작동하지 않는 경우가 생길수가 있으니 반드시 헤더 파일을 포함시키는것이 좋습니다.
Dream, Passion and Challenge..
프로토타입
네... 아주 완전히 뒤통수 맞는 경우가 생기죠....
예전에 비슷한 경험을 해본 적이 있습니다.... 까먹고 프로토타입을 선언 안 해줬더니.. 실수 값이 뭘 집어넣어도 0이 나오더군요...-_-
디버거로 하나하나 쫓아가서... 봐도
분명히 로컬변수값은 1.2얼마얼마인데... 함수 안에 들어가면
0이 되어있고...
-_-결국은 디스어셈블 해서...-_-알아냈다는...
사실 이런 실수는 -Wall 옵션을 붙여서 컴파일하면 금방 알아낼 수 있죠....
혹시 위에 설명이 되었나 안 되었나 못봤지만...
그냥 이유를 설명해드리면...
prototype 선언을 안 해놓으면... 기본으로 리턴값과 모든 파라메터는 int라고 생각합니다... 당연히 호출하는 쪽에서는 이를 int로 캐스팅하고... 받는쪽에서는 제대로 받지를 못하고.....
게다가 특별히 옵션을 안 걸어놓으면 워닝도 하나도 안 뜨고...
Consider the ravens: for they neither sow nor reap; which neither have storehouse nor barn; and God feedeth them: how much more are ye better than the fowls?
Luke 12:24
Wall의 의미는 무엇인지요?
궁금합니다.
RM -RF /bin
-Wall
man gcc 하니 다음과 같이 나오네요..
간단히 말해서 warning 이 발생할 수 있는 모든 경우에 warning 출력을 해주라는 것입니다.
보통 모든 경우에 대해 warning 이 켜지지 않았는데, 위 옵션을 주면 모든 Warning에 대해 출력을 해줍니다.
Dream, Passion and Challenge..
Re: 해결했습니다.
header를 포함하지 않아도 C++에서는 그렇게 안되지만 C에서는 잘 되는 이유는 사용하는 함수명이 그대로 object file에 symbol로 들어가 link되기 때문입니다.
하지만, C++에서는 argument를 알아야 정확한 symbol이 만들어 집니다.
function name mangling 혹은 decoration 이라고하지요.
---
http://coolengineer.com
댓글 달기