표준 C는 존재하지 않는다
원제 Your C is not standard C
119 포인트댓글 85
Key Point
업계 표준인 GCC/Clang이 C 표준을 준수하지 않으면서, 실무 개발자들은 부지불식간에 비표준 코드를 작성하고 있기 때문이다.
핵심 요약
- GCC와 Clang은 표준 C와 실제 동작이 다른 여러 비표준 확장을 기본으로 지원하며, 실무에서 쓰이는 C는 표준 명세와 멀어지고 있다.
- asm 키워드를 표준 C에서는 예약어로 취급하지 않아 유효한 식별자로 쓸 수 있지만, GCC와 Clang은 기본적으로 이를 확장 키워드로 인식한다.
- 표준은 FLT_ROUNDS 매크로가 실행 중에 fesetround() 함수로 변경된 부동소수점 반올림 모드를 반영해야 한다고 명시하지만, GCC는 항상 1(nearest)로 고정값을 제공한다.
- C99 표준화 후 27년이 지났지만 GCC는 다섯 가지 표준 부동소수점 제어 프래그마(FP_CONTRACT, FENV_ACCESS, CX_LIMITED_RANGE, FENV_ROUND, FENV_DEC_ROUND)를 아직 지원하지 않으며, Clang은 C99 프래그마 일부만 지원한다.
- 표준은 함수 반환 타입의 const 같은 한정자를 제거해야 하지만, Clang은 'int f()'와 'const int f()'를 서로 다른 선언으로 취급해 충돌 오류를 발생시킨다.
- musl의 stdarg.h는 C23의 단일 인자 va_start를 지원하지 않으며, musl이 제공하는 헤더가 컴파일러 내장 헤더보다 우선되어 C23 기능을 사용할 수 없다.
- 표준 C에서는 문자열을 부동소수점으로 변환할 때 오류를 이식 가능하게 확인할 방법이 없고, POSIX와 표준 C가 일부 함수 사양에서 상충하는 부분들도 있다.