다름이 아니라 제가 윈도우와 리눅스에 호환되는 서버를 개발중인데요..
문제가 long long에 해당되는 숫자가 리눅스에서는 에러를 내더군요..
그래서 확인해 보니 뒤에 LL을 붙이면 되더라구요..
예를 들어 20000000000000000LL 이런식으로 요..
헌데 넘 불편한 점이 많아서..
이걸 안넣고도 컴파일타임에 에러를 안내게 하는 방법은 없나요??
^^ 한수 갈카 주세요..
기본적으로 컴파일러는 상수뒤에 아무런 식별자를 쓰지 않으면 int형으로 인식하는 것으로 알고 있습니다.
따라서 20000000000000000라는 숫자 뒤에 ll을 붙이지 않으면 int로 인식해서 오버플로 되는 값은 버려지게 될겁니다.
윈도에서는 에러나고 리눅스에서는 에러가 안나는건 이 오버플로되는 값이 있을때 vc 에서는 그냥그냥 넘어가지만 gcc에서는 이걸 인식하고 사용자에게 잠재적 "위험"이 있다는것을 알려주는 것입니다. 그런다고 vc가 만들어내는 코드가 정상적인 것이라고는 단정 할수 없습니다.. 잠재적인 위험이 있는 것이죠.
불편하시더라도 컴파일러 입장에서는 가능한 자세한것이 정확한 코드를 만들어내는데 편하기 때문에 써주시는것이 좋습니다..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
에러가 아니라 경고메시지 아닌가요? 자동으로 적절한 타입이 선택이 될텐데
에러가 아니라 경고메시지 아닌가요? 자동으로 적절한 타입이 선택이 될텐데요.
기본적으로 컴파일러는 상수뒤에 아무런 식별자를 쓰지 않으면 int형으로
기본적으로 컴파일러는 상수뒤에 아무런 식별자를 쓰지 않으면 int형으로 인식하는 것으로 알고 있습니다.
따라서 20000000000000000라는 숫자 뒤에 ll을 붙이지 않으면 int로 인식해서 오버플로 되는 값은 버려지게 될겁니다.
윈도에서는 에러나고 리눅스에서는 에러가 안나는건 이 오버플로되는 값이 있을때 vc 에서는 그냥그냥 넘어가지만 gcc에서는 이걸 인식하고 사용자에게 잠재적 "위험"이 있다는것을 알려주는 것입니다. 그런다고 vc가 만들어내는 코드가 정상적인 것이라고는 단정 할수 없습니다.. 잠재적인 위험이 있는 것이죠.
불편하시더라도 컴파일러 입장에서는 가능한 자세한것이 정확한 코드를 만들어내는데 편하기 때문에 써주시는것이 좋습니다..
-------------------------------------------------------------------------------
It's better to appear stupid and ask question than to be silent and remain stupid.
[quote="chadr"]기본적으로 컴파일러는 상수뒤에 아무런 식별자를
그렇지 않습니다. C99를 따르는 컴파일러라면 전혀 문제 없습니다.
http://bbs.kldp.org/viewtopic.php?p=272667&highlight=#272667
C99를 지원하지 않는 VC++에서 문제가 없는 이유는 확장 기능으로서 제공하기
때문인 것 같습니다.
이 말씀에 대해서는 동의합니다.
OP의 질문에 대해서: LL을 붙이지 않아도 적법한 코드입니다만, 현재 양쪽 환경에서
모두 동작하도록 하는 현실적인 방법을 LL을 붙이는 것입니다.
댓글 달기