C99
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.
1. 개요
C99는 1999년 ISO/IEC 9899:1999로 출판된 C 프로그래밍 언어의 표준으로, ANSI 표준화 이후 정체되었던 C 언어의 표준을 개정하여 새로운 기능들을 추가했다. 주요 기능으로는 인라인 함수, 가변 길이 배열, `//` 주석, 새로운 자료형, 라이브러리 함수, 헤더 파일 등이 있으며, IEEE 부동소수점 자료에 대한 개선된 지원도 포함한다. C99는 C90과 하위 호환성을 가지면서도 몇 가지 엄격한 규칙을 적용했으며, C++와의 호환성을 고려한 부분이 있다. GCC, Clang, 인텔 C++ 컴파일러 등 많은 컴파일러가 C99 표준을 지원하며, 컴파일러별 지원 수준은 다르다. C99는 한국 소프트웨어 개발 환경에도 큰 영향을 미쳤으며, 임베디드 시스템, 시스템 프로그래밍, 게임 개발 등에서 널리 활용된다.
더 읽어볼만한 페이지
- 프로그래밍 언어 표준 - ISO/IEC JTC 1/SC 22
ISO/IEC JTC 1/SC 22는 프로그래밍 언어, 환경 및 시스템 소프트웨어 인터페이스 분야의 표준화를 담당하는 ISO/IEC JTC 1의 하위 위원회이며, 다양한 프로그래밍 언어와 시스템 소프트웨어 인터페이스의 표준화를 목표로 1985년에 설립되었다. - 프로그래밍 언어 표준 - C11 (C 버전)
C11은 2011년 발표된 C 언어 표준으로, C99를 개선하여 데이터 구조 정렬, 반환하지 않는 함수 지정, 형식-제네릭 표현식, 멀티스레딩 및 유니코드 지원 강화, 보안 기능 강화 등 다양한 기능을 추가했다. - C 프로그래밍 언어 - C (프로그래밍 언어)
C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다. - C 프로그래밍 언어 - 헤더 파일
헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
| C99 | |
|---|---|
| C99 | |
![]() | |
| 종류 | |
| 종류 | 프로그래밍 언어 |
| 패러다임 | 명령형 프로그래밍 구조적 프로그래밍 |
| 고안자 | ANSI |
| 개발자 | ISO/IEC JTC1/SC22/WG14 |
| 첫 발표 | 1999년 |
| 표준 | ISO/IEC 9899:1999 |
| 후계 | C11 |
| 디자인 | |
| 파일 확장자 | .c, .h |
| 영향을 준 언어 | C++, C 샤프, 자바, 펄 |
2. 역사
ANSI의 표준화 이후 C 언어 표준은 상대적으로 정체되어 있었던 반면, C++는 계속 진화하며 표준화가 진행되었다. 1995년에는 1990년 C 표준에 대한 규약 수정안 1이 출판되었는데, 이는 몇 가지 세부 사항을 교정하고 국제적 문자 세트에 대한 보다 확장된 지원을 위한 것이었다.[1] 1990년대 후반에 C 표준은 추가 개정을 거쳐 1999년에 ISO/IEC 9899:1999가 출간되었으며, 이를 흔히 C99라고 부른다.[1] C99는 기술적 교정에 의해 현재까지 세 번 수정되었다. 국제 C 표준은 실무 그룹 ISO/IEC JTC1/SC22/WG14에 의해 관리된다.[1][2][3]
C99에는 여러 컴파일러에서 이미 확장 기능으로 구현된 다양한 기능들이 추가되었다.[4]
3. 새로운 기능
인라인 함수, 변수 선언 위치 제한 완화, 새로운 자료형(long long int, 확장 정수형, 명시적 불리언 자료형, 복소수를 나타내기 위한 complex) 도입, BCPL이나 C++과 같은 // 주석, snprintf 등의 새로운 라이브러리 함수, stdbool.h 및 inttypes.h와 같은 새로운 헤더 파일, 자료형에 무관하게 동작하는 수학 함수 (tgmath.h), IEEE 부동소수점 지원 개선, 지정된 이니셜라이저, 복합 리터럴, 가변 인수 매크로, restrict 한정자 등이 C99의 주요 기능으로 포함되었다.[3]
3. 1. 언어 기능
long long int, 선택적인 확장 정수형, 명시적 불리언 자료형, 복소수를 나타내기 위한 complex[3][4]//로 시작하는 주석 허용[3][4]snprintf와 같은 새로운 라이브러리 함수 추가[3][4]stdbool.h 및 inttypes.h와 같은 새로운 헤더 파일 추가[3][4]tgmath.h에 포함) 추가[3][4]restrict 한정자 도입[3][4]static 사용[8]3. 2. 라이브러리 기능
C99 표준에는 다음과 같은 라이브러리 기능들이 추가되었다.
4. C90과의 하위 호환성
C99는 대부분의 영역에서 C90과 하위 호환되지만, 몇 가지 엄격해진 부분이 있다. 특히, 형식 지정자가 빠진 선언을 `int` 자료형으로 더 이상 간주하지 않는다. C 표준 위원회에서는 컴파일러가 형식 지정자를 실수로 빠뜨린 것을 조용히 넘어가기보다는 문제로서 진단하는 것이 더욱 가치가 있다고 보고 이러한 결정을 내렸다.[3] 실제 컴파일러는 형식 지정자가 빠진 것을 오류로 지적할 가능성이 높지만, `int`가 지정된 것으로 보고 번역을 계속할 수도 있다.
또한, C89에서는 선언되지 않은 함수는 반환값 형이 `int`이고, 인수의 수와 형이 임의의 함수로 해석되었지만, C99에서는 문법 위반이 된다.
5. C++와의 호환성
C99 표준의 일부 기능은 C++ 기술 보고서 1 및 C++11과 같은 C++ 표준에 포함되었다.[3] 여기에는 정수형, 헤더 파일, 라이브러리 함수 등이 해당한다.[4] 다만, C++ 표준에 이미 유사한 기능이 포함되어 있어 가변 길이 배열은 포함되지 않았다.
C++는 C99의 여러 기능을 수용하면서도, C++만의 고유한 특징과 기능을 발전시켜왔다.
6. 컴파일러 지원 현황
GCC를 비롯한 여러 C 컴파일러들이 C99의 새로운 기능 대부분을 지원하고 있다. 그러나 마이크로소프트나 볼랜드 등은 C++에 집중하면서 C99 지원에 소극적이었다.
GCC는 C99 기능을 상당히 많이 지원하지만, 2008년 11월 기준으로 일부 기능은 제대로 작동하지 않거나 지원되지 않았다.[42] GCC 4.x 버전까지는 C89에 GNU 확장을 더한 `-std=gnu89`가 기본값이었고, Clang은 C99에 GNU 확장을 더한 `-std=gnu99`가 기본값이다. GCC 5.0부터는 C11에 GNU 확장을 더한 `-std=gnu11`이 기본값이다.[43]
썬 마이크로시스템즈는 자사의 썬 스튜디오가 C99 기능을 완벽히 지원한다고 주장한다.[46]
C 인터프리터인 Ch도 C99의 주요 기능들을 지원한다.[47]
마이크로소프트 비주얼 C++는 2013년부터 C99의 대부분을 구현하기 시작했다.[44] 2015년까지 `tgmath.h`나 `snprintf()` 등이 구현되지 않았지만, 2017년에 구현되었다.
Watcom C 컴파일러는 C99 표준 중 가장 많이 사용되는 부분을 구현하고 있으며, 2010년 현재 최신 버전인 1.9에서는 `-za99` 옵션을 통해 C99 기능을 활성화할 수 있다고 명시되어 있다.[45]
다음은 여러 컴파일러들의 C99 지원 현황을 정리한 표이다.
| 컴파일러 | 지원 수준 | C99 호환성 세부 정보 |
|---|---|---|
| Acorn C/C++ | 부분 지원 | 공식 문서에 따르면 "대부분"의 컴파일러 기능과 "일부" 라이브러리 함수가 지원된다. |
| AMD x86 Open64 컴파일러 제품군 | 대부분 지원 | GCC와 동일한 수준의 C99 지원을 제공한다.[14] |
| cc65 | 부분 지원 | 전체 C89 및 C99 지원은 플랫폼 제한 (MOS Technology 6502)으로 인해 구현되지 않았다. `Complex` 및 64비트 정수(`long long`)와 같은 일부 C99 유형에 대한 지원은 계획되지 않았다.[15] |
| Ch | 부분 지원 | 주요 C99 기능을 지원한다.[16] |
| Clang | 대부분 지원 | C99 부동 소수점 프라그마를 제외한 모든 기능을 지원한다.[17] |
| CompCert | 대부분 지원 | 공식적으로 정확성이 증명된 인증된 컴파일러이다. C99 복소수 및 VLA를 제외한 모든 기능과 switch 문에 대한 사소한 제한(Duff의 장치 없음)을 지원한다.[18] |
| cparser | 전체 지원 | C99 기능을 지원한다.[19] |
| C++ Builder | 64비트 모드에서만 지원 | |
| Digital Mars C/C++ 컴파일러 | 부분 지원 | tgmath.h 및 `_Pragma`와 같은 일부 기능에 대한 지원이 부족하다.[20] |
| GCC | 대부분 지원 | 표준 프라그마 및 IEEE 754/IEC 60559 부동 소수점 지원이 메인라인 GCC에 없다. 또한, 일부 기능(확장 정수 유형 및 새로운 라이브러리 함수 등)은 C 표준 라이브러리에서 제공되어야 하며 GCC의 범위를 벗어난다.[21] GCC의 4.6 및 4.7 릴리스도 동일한 수준의 준수를 제공한다.[22][23] 하드웨어가 준수하는 경우에도 부분적인 IEEE 754 지원: 잘못된 최적화를 방지하기 위해 일부 컴파일러 옵션이 필요할 수 있지만(예: `-std=c99` 및 `-fsignaling-nans`), `-frounding-math`를 사용하는 경우에도 방향 반올림 모드에 대한 완전한 지원은 없다.[24] |
| 그린 힐스 소프트웨어(Green Hills Software) | 전체 지원 | |
| IBM C for AIX, V6 [25] 및 XL C/C++ V11.1 for AIX [26] | 전체 지원 | |
| IBM Rational logiscope | 전체 지원 | Logiscope 6.3까지는 C99의 기본 구성 요소만 지원되었다. C99는 Logiscope 6.4 이상 버전에서 공식적으로 지원된다.[27] |
| 포틀랜드 그룹(The Portland Group) PGI C/C++ | 전체 지원 | |
| IAR 시스템즈(IAR Systems) 임베디드 워크벤치 | 대부분 지원 | UCN(유니버설 문자 이름)을 지원하지 않는다. ARM, Coldfire, MSP430, AVR, AVR32, 8051, ...과 같은 임베디드 타겟용 컴파일러이다. x86 타겟은 없다. |
| 인텔 C++ 컴파일러(Intel C++ compiler) | 대부분 지원 | |
| 마이크로소프트 비주얼 C++(Microsoft Visual C++) | 부분 지원[28] | 비주얼 C++ 2012 및 이전 버전은 C99를 지원하지 않았다.[29][30][31] 비주얼 C++ 2013은 인기 있는 오픈 소스 프로젝트를 컴파일하는 데 필요한 C99의 제한된 하위 집합을 구현했다.[32][33] 비주얼 C++ 2015는 컴파일러에서 아직 지원되지 않는 컴파일러 기능에 의존하는 모든 라이브러리 기능(예: tgmath.h는 구현되지 않음)을 제외하고 C99 표준 라이브러리를 구현했다.[28] 비주얼 C++ 2019 (16.6)는 C99 호환 전처리기 옵트인 지원을 추가했다.[34] |
| 오픈 와콤(Open Watcom) | 부분 지원 | 표준의 가장 일반적으로 사용되는 부분을 구현한다. 그러나 이는 문서화되지 않은 명령줄 스위치 "-za99"를 통해서만 활성화된다. 세 가지 C99 기능은 v1.0 이전부터 C90 확장으로 번들로 제공되었다. C++ 스타일 주석(//), 가변 배열 멤버, 열거형 선언에 허용되는 후행 쉼표.[35] |
| 펠레스 C(Pelles C) | 전체 지원 | 모든 C99 기능을 지원한다.[36] |
| 포터블 C 컴파일러(Portable C compiler) | 부분 지원 | C99를 준수하도록 노력하고 있다. |
| 선 스튜디오(Sun Studio (software)) | 전체 지원[37] | |
| 암스테르담 컴파일러 키트(The Amsterdam Compiler Kit) | 지원 안함 | 현재 C99 프런트 엔드에 대한 조사가 진행 중이다. |
| 타이니 C 컴파일러(Tiny C Compiler) | 부분 지원 | 복소수를 지원하지 않는다.[38][39] 가변 길이 배열은 지원되지만 함수 인수로 지원되지 않는다. 개발자는 "TCC는 전체 ISOC99 준수를 향해 나아가고 있다"고 언급했다.[40] |
| vbcc | 부분 지원 |
7. 버전 감지
표준 매크로 `__STDC_VERSION__`가 `199901L`로 정의되면 C99 지원이 가능함을 나타낸다. C90에서의 `__STDC__` 매크로처럼, `__STDC_VERSION__`은 C90과 C99간에 다르게 컴파일할 수 있는 코드를 작성하는데 사용할 수 있다. 다음은 두 경우 모두에서 `inline`을 사용할 수 있도록 보장하는 예시이다.
```c
#if __STDC_VERSION__ >= 199901L
/* "inline"은 키워드입니다 */
#else
# define inline static
#endif
8. C99 이후의 표준
1999년 C 표준이 비준된 이후, 표준 작업 그룹은 임베디드 프로세싱에 대한 개선된 지원, 추가적인 문자 데이터 형식(유니코드 지원), 그리고 개선된 경계 검사를 갖춘 라이브러리 함수를 명시하는 기술 보고서를 준비했다.[41] 10진 부동 소수점, 추가적인 수학적 특수 함수, 그리고 추가적인 동적 메모리 할당 함수를 다루는 기술 보고서에 대한 작업이 계속 진행 중이다. C 및 C++ 표준 위원회는 스레드 프로그래밍에 대한 사양에 대해 협력해 왔다.
다음 C 표준 개정판인 C11은 2011년에 비준되었다.[41] C 표준 위원회는 기존 구현에 의해 테스트되지 않은 새로운 기능의 채택을 제한하는 지침을 채택했다. 메모리 모델을 개발하여 시퀀스 포인트를 명확히 하고 스레드 프로그래밍을 지원하는 데 많은 노력을 기울였다.
C99의 후속 사양은 C11 (ISO/IEC 9899:2011)이다.
안전하지 않은 인터페이스 설계에 대한 문제 보고에 대응하여 공식적으로 폐지 예정인 gets 함수가 C11에서는 삭제되었고, `gets_s`를 사용해야만 하게 되었다.
참조
[1]
웹사이트
ISO/IEC 9899:1999 - Programming languages - C
https://www.iso.org/[...]
Iso.org
2011-12-08
[2]
웹사이트
IEEE 754 Support in C99
https://grouper.ieee[...]
[3]
웹사이트
Standards - Using the GNU Compiler Collection (GCC)
https://gcc.gnu.org/[...]
Gcc.gnu.org
[4]
웹사이트
C Dialect Options - Using the GNU Compiler Collection (GCC)
https://gcc.gnu.org/[...]
Gcc.gnu.org
2009-05-06
[5]
웹사이트
Using the GNU Compiler Collection (GCC): Designated Initializers
https://gcc.gnu.org/[...]
[6]
웹사이트
Using the GNU Compiler Collection (GCC): Compound Literals
https://gcc.gnu.org/[...]
[7]
웹사이트
What every programmer should know about memory
https://lwn.net/Arti[...]
LWN.net
2007-10-23
[8]
서적
ISO/IEC 9899:1999 specification, TC3
https://www.open-std[...]
[9]
웹사이트
Differences Among IEEE 754 Implementations
https://www.validlab[...]
[10]
웹사이트
A conversation with William Kahan.
https://drdobbs.com/[...]
1997-11-01
[11]
웹사이트
The Baleful Effect of Computer Benchmarks upon Applied Mathematics, Physics and Chemistry
https://www.cs.berke[...]
1996-06-11
[12]
웹사이트
How Futile are Mindless Assessments of Roundoff in Floating-Point Computation?
https://www.cs.berke[...]
2006-01-11
[13]
웹사이트
C99 acknowledged at last as Microsoft lays out its path to C++14
https://arstechnica.[...]
2013-06-29
[14]
웹사이트
Using the x86 Open64 Compiler Suite
https://developer.am[...]
Developer.amd.com
[15]
웹사이트
cc65 - a freeware C compiler for 6502 based systems
https://www.cc65.org[...]
[16]
웹사이트
C/C++ interpreter Ch C99 features
https://www.softinte[...]
SoftIntegration, Inc.
2008-02-15
[17]
웹사이트
Clang Compiler User's Manual
https://clang.llvm.o[...]
[18]
웹사이트
The CompCert C verified compiler documentation and user's manual (Version 3.10)
https://compcert.org[...]
2021-11-19
[19]
웹사이트
libfirm homepage
https://pp.info.uni-[...]
[20]
웹사이트
C Language Implementation - Digital Mars
https://www.digitalm[...]
[21]
웹사이트
Status of C99 features in GCC
https://gcc.gnu.org/[...]
Free Software Foundation, Inc.
2021-07-28
[22]
웹사이트
Status of C99 features in GCC 4.6
https://gcc.gnu.org/[...]
Free Software Foundation, Inc.
2013-05-23
[23]
웹사이트
Status of C99 features in GCC 4.7
https://gcc.gnu.org/[...]
Free Software Foundation, Inc.
2013-05-23
[24]
웹사이트
Semantics of Floating Point Math in GCC
https://gcc.gnu.org/[...]
2018-07-20
[25]
웹사이트
IBM C for AIX, V6.0 Now Supports the C99 Standard
https://www-01.ibm.c[...]
2002-07-02
[26]
웹사이트
IBM - XL C/C++ for AIX
https://www-01.ibm.c[...]
[27]
웹사이트
IBM Rational Logiscope support for C99 standard - United States
https://www-01.ibm.c[...]
2012-02-24
[28]
웹사이트
What's New for Visual C++ in Visual Studio 2015
https://msdn.microso[...]
Microsoft Developer Network
[29]
웹사이트
Reader Q&A: What about VC++ and C99?
http://herbsutter.co[...]
2012-05-03
[30]
웹사이트
A.27 Use of C99 Variable Length Arrays
https://msdn.microso[...]
Microsoft
[31]
웹사이트
Microsoft to C99 Developers: Use ISO C++
https://www.infoq.co[...]
[32]
웹사이트
C99 library support in Visual Studio 2013
https://blogs.msdn.c[...]
Microsoft
2013-07-19
[33]
웹사이트
C++11/14 STL Features, Fixes, And Breaking Changes In VS 2013
https://devblogs.mic[...]
Blogs.msdn.com
2013-06-28
[34]
웹사이트
Announcing full support for a C/C++ conformant preprocessor in MSVC
https://devblogs.mic[...]
Microsoft
2020-03-27
[35]
웹사이트
C99 compliance in Open Watcom
https://openwatcom.o[...]
[36]
웹사이트
Pelles C Overview
https://www.smorgasb[...]
2013-01
[37]
웹사이트
Sun Studio 12: C Compiler 5.9 Readme
https://docs.oracle.[...]
Sun Microsystems, Inc.
2007-05-31
[38]
웹사이트
Tiny C Compiler Reference Documentation
https://bellard.org/[...]
2016-01-31
[39]
문서
TODO list
https://repo.or.cz/w[...]
[40]
웹사이트
TCC : Tiny C Compiler
https://bellard.org/[...]
2016-01-31
[41]
웹사이트
Standards - Using the GNU Compiler Collection (GCC)
https://gcc.gnu.org/[...]
Gcc.gnu.org
2014-04-08
[42]
문서
Status of C99 features in GCC
http://gcc.gnu.org/c[...]
[43]
웹사이트
GCC 5 Release Series — Changes, New Features, and Fixes
https://gcc.gnu.org/[...]
GCC team
2018-09-30
[44]
블로그
C99 library support in Visual Studio 2013 - Visual C++ Team Blog - Site Home - MSDN Blogs
http://blogs.msdn.co[...]
[45]
웹사이트
C99 compliance in Open Watcom
http://www.openwatco[...]
2009-03-11
[46]
웹사이트
Sun Studio 12: C Compiler 5.9 Readme
http://developers.su[...]
Sun Microsystems, Inc.
2007-05-31
[47]
웹사이트
C/C++ interpreter Ch C99 features
http://www.softinteg[...]
SoftIntegration, Inc.
2008-02-15
[48]
문서
Open source development using C99
http://www.ibm.com/d[...]
[49]
문서
On the initialization of structures
http://lwn.net/Artic[...]
[50]
웹인용
ISO/IEC 9899:1999 - Programming languages - C
http://www.iso.org/i[...]
Iso.org
2011-12-08
본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.
문의하기 : help@durumis.com
