SSAFY

[SSAFY 임베디드 C] int 암시적 형변환

딸기토끼0623 2024. 9. 28. 11:50

1. 암시적 int 형변환 c89/90 표준

c99 공식 문서

사진을 누르면 c99 공식 문서로 갈 수 있다. 옛날 옛적 c89/90, c95 까지는 암시적 형변환이 가능했다!! (int, 전역변수 한정) 문법은 아래와 같다.

#include <stdio.h>

a = 10;

int main(){
        printf("%d\n", a);
}

실제로 위 코드를 GCC 컴파일러로 실행해 보면 Warning 만 뜰뿐, 컴파일도, 실행도 잘만 되는걸 알 수 있다.

진짜 된다..!!


2. GCC 컴파일 시 컴파일러 버전을 셋팅하기

참고로 GCC는 컴파일러 버전을 명시할 수 있다. 그래서 이번엔 컴파일러 버전을 명시해보기로 했다. 참고로 c95는 안된다.

 

-std=cxx 옵션을 붙이면 된다.

c89/c90/ansi

셋 다 전부 똑같은 컴파일러로 봐도 무방하고, 실제로 셋 다 모두 컴파일 및 실행에 문제가 없다.

다만 c95는 지원하지 않는다.

c95


3. c99 이후에서도 컴파일이.. 된다!

c99/c17

근데 이제 c99 이후에서도 된다..!! 

실행도 된다..!!


4. -Wimplicit-int

두 상황에서의 Warning 메세지를 잘 읽어보면 GCC 가 왜 이렇게 컴파일러 표준을 무시하고 암시적 형변환을 허용하는지, 실마리를 찾을 수 있다.

-Wimplicit-int

C99 이후 버전으로 컴파일시 -Wimplicit-int 라는 워닝이 추가로 생성되는 걸 볼 수 있다.

GCC는 Warning 에 대한 추가적인 지시가 없다면, 컴파일러 표준에 따른 워닝만 생성하기 때문에, c99이후에서는 암시적 형변환에 대한 워닝을 추가적으로 생성한다.

 

그렇다면 주제의 의문이 생긴다. Error 가 아닌 Warning??


5. 결론

ChatGPT한테도 물어보고, GCC 레퍼런스등등 찾아본 결과 내린 결론은 다음과 같다. (정확히는 GCC 레퍼런스가 양이 너무 많아서 정확히 해당 내용을 찾지는 못했다..;;;)

 

GCC 는 레거시 지원을 위해 여전히 c89 최초 레퍼런스 컴파일러를 따릅니다. 그 외 나중에 Removed 된 것이 있다면 Warning 을 제공할뿐, 컴파일은 여전히 제공합니다.
대표적으로c90 으로 컴파일시 암시적 형변환에 대한 워닝을 제공하지 않지만, c99 로 컴파일시 해당 워닝을 제공합니다. 하지만 역시 여전히 컴파일은 가능합니다.

 

Chat GPT가 말해준 내용을 요약해서 다시 적어보자면 위와 같다.


6. 번외

-Wall

사실 c90 이어도 GCC 내부적으로는 암시적 형변환이 위험하다는 것을 인지하고 있는듯 하다.

-Wall 옵션을 걸어보면 -Wimplicit-int 워닝이 제공된다.