C99는 보편적으로 지원됩니까?
-
02-07-2019 - |
문제
C99 표준은 오늘날의 컴파일러에서 얼마나 보편적으로 지원됩니까? 나는 GCC조차도 그것을 완전히 지원하지 않는다는 것을 이해합니다. 이게 옳은 거니?
C99의 어떤 기능이 다른 것보다 더 많이 지원되는지, 즉 대부분의 컴파일러가 나를 이해할 수 있다고 확신 할 수 있습니까?
해결책
휴대용 C 코드를 작성하려면 C89 (Old ANSI C 표준)로 작성하는 것이 좋습니다. 이 표준은 대부분의 컴파일러에서 지원됩니다.
Intel C 컴파일러가 있습니다 아주 좋은 C99 지원 그리고 그것은 빠른 바이너리를 생산합니다. (감사 0x69!)
MSVC가 지원합니다 몇 가지 새로운 기능 Microsoft는 향후 버전에서 지원을 확대 할 계획입니다.
GCC는 C99의 새로운 것들을 지원합니다. 그들은에 관한 테이블을 만들었습니다 C99 기능의 상태. 아마도 C99의 가장 유용한 기능은 가변 길이 배열이며 GCC는 지금 지원합니다. 그 소리 (LLVM의 C Fronted)는 부동 소수점 pragmas를 제외한 대부분의 기능을 지원합니다.
Wikipedia는 다음과 같습니다 C99 지원에 대한 좋은 요약 컴파일러의.
다른 팁
누군가 인텔 컴파일러에 C99 지원이 있다고 언급했습니다. 또한 있습니다 comeau c/c ++ 컴파일러 C99를 완전히 지원합니다. 이것들은 내가 알고있는 유일한 것입니다.
잘 지원되지 않기 때문에 사용하지 않는 C99 기능은 다음과 같습니다.
- 가변 길이 배열
- 가변 수의 매개 변수가있는 매크로.
C99는 정기적으로 사용하는 기능이 잘 지원되는 것 같습니다 (Microsoft 제외) :
stdint.h
snprintf()
- MS에는 비표준이 있습니다_snprintf()
항상 버퍼를 종료하는 널 널 널의 심각한 제한이 있고 버퍼가 얼마나 큰지 표시하지 않습니다.
Microsoft의 비 지원을 위해 일하기 위해 나는 공개 도메인 stdint.h
Mingw에서 (VC6에서도 일하도록 수정 한) 및 거의 공개 도메인 snprintf()
Holger Weiss에서
Microsoft에서 지원하지 않지만 프로젝트에 따라 다른 컴파일러에서 여전히 사용하는 품목은 다음과 같습니다.
- 혼합 선언 및 코드
- 인라인 기능
_Pragma()
- 이것은 pragmas를 훨씬 더 유용하게 만듭니다
GCC의 경우 a가 있습니다 모든 지원되는 기능이있는 테이블. 누락 된 가장 큰 것은 가변 길이 배열 인 것 같습니다. 다른 누락 된 기능의 대부분은 언어 기능보다는 라이브러리 문제입니다.
IBM C 컴파일러는 C99로 호출 될 때 C99 지원이 있지만 CC 또는 XLC로 호출 할 때는 그렇지 않습니다.
보다 C99 GNU의 수포 상태 현재 지원되는 기능에 대한 자세한 내용은
선 스튜디오 전체 C99 사양을 지원하도록 권장됩니다. 나는 그것들을 사용한 적이 없으므로 확인할 수 없습니다.
Microsoft 컴파일러가 C99 사양을 완전히 지원한다고 생각하지 않습니다. 그들은 현재 C ++에 훨씬 더 집중되어 있습니다.
Clang (LLVM 기반 C 및 C ++ 컴파일러)은 C99 지원이 매우 좋습니다. 나는 그것이지지하지 않는 유일한 것은 플로팅 포인트 pragmas라고 생각합니다.
Microsoft는 C ++ 표준을 추적하는 것으로 보이지만 C99를 지원하지 않습니다. (일부 기능은 체리를 찍을 수 있지만 겹치는 곳에 체리를 픽킹하는 C ++ 0x라고 할 수 있습니다.)
Visual Studio .NET 2003에서 새로운 프로젝트에는 'Compile C 코드가 C ++ (/TP)'옵션을 기본적으로 활성화합니다.