1. 암시적 int 형변환 c89/90 표준
사진을 누르면 c99 공식 문서로 갈 수 있다. 옛날 옛적 c89/90, c95 까지는 암시적 형변환이 가능했다!! (int, 전역변수 한정) 문법은 아래와 같다.
#include <stdio.h>
a = 10;
int main(){
printf("%d\n", a);
}
실제로 위 코드를 GCC 컴파일러로 실행해 보면 Warning 만 뜰뿐, 컴파일도, 실행도 잘만 되는걸 알 수 있다.
2. GCC 컴파일 시 컴파일러 버전을 셋팅하기
참고로 GCC는 컴파일러 버전을 명시할 수 있다. 그래서 이번엔 컴파일러 버전을 명시해보기로 했다. 참고로 c95는 안된다.
-std=cxx
옵션을 붙이면 된다.
셋 다 전부 똑같은 컴파일러로 봐도 무방하고, 실제로 셋 다 모두 컴파일 및 실행에 문제가 없다.
다만 c95는 지원하지 않는다.
3. c99 이후에서도 컴파일이.. 된다!
근데 이제 c99 이후에서도 된다..!!
실행도 된다..!!
4. -Wimplicit-int
두 상황에서의 Warning 메세지를 잘 읽어보면 GCC 가 왜 이렇게 컴파일러 표준을 무시하고 암시적 형변환을 허용하는지, 실마리를 찾을 수 있다.
C99 이후 버전으로 컴파일시 -Wimplicit-int 라는 워닝이 추가로 생성되는 걸 볼 수 있다.
GCC는 Warning 에 대한 추가적인 지시가 없다면, 컴파일러 표준에 따른 워닝만 생성하기 때문에, c99이후에서는 암시적 형변환에 대한 워닝을 추가적으로 생성한다.
그렇다면 주제의 의문이 생긴다. Error 가 아닌 Warning??
5. 결론
ChatGPT한테도 물어보고, GCC 레퍼런스등등 찾아본 결과 내린 결론은 다음과 같다. (정확히는 GCC 레퍼런스가 양이 너무 많아서 정확히 해당 내용을 찾지는 못했다..;;;)
GCC 는 레거시 지원을 위해 여전히 c89 최초 레퍼런스 컴파일러를 따릅니다. 그 외 나중에 Removed 된 것이 있다면 Warning 을 제공할뿐, 컴파일은 여전히 제공합니다.
대표적으로c90 으로 컴파일시 암시적 형변환에 대한 워닝을 제공하지 않지만, c99 로 컴파일시 해당 워닝을 제공합니다. 하지만 역시 여전히 컴파일은 가능합니다.
Chat GPT가 말해준 내용을 요약해서 다시 적어보자면 위와 같다.
6. 번외
사실 c90 이어도 GCC 내부적으로는 암시적 형변환이 위험하다는 것을 인지하고 있는듯 하다.
-Wall 옵션을 걸어보면 -Wimplicit-int 워닝이 제공된다.
'SSAFY' 카테고리의 다른 글
[SSAFY 임베디드 C] 비트 필드 연산 (Eclipse vs Ubuntu) (0) | 2024.09.28 |
---|---|
[SSAFY 12기 합격 후기] 준비 과정 및 꿀팁! (전공) (0) | 2024.06.19 |