맨위로가기

C99

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의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
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]

3. 새로운 기능

C99에는 여러 컴파일러에서 이미 확장 기능으로 구현된 다양한 기능들이 추가되었다.[4]

인라인 함수, 변수 선언 위치 제한 완화, 새로운 자료형(long long int, 확장 정수형, 명시적 불리언 자료형, 복소수를 나타내기 위한 complex) 도입, BCPL이나 C++과 같은 // 주석, snprintf 등의 새로운 라이브러리 함수, stdbool.hinttypes.h와 같은 새로운 헤더 파일, 자료형에 무관하게 동작하는 수학 함수 (tgmath.h), IEEE 부동소수점 지원 개선, 지정된 이니셜라이저, 복합 리터럴, 가변 인수 매크로, restrict 한정자 등이 C99의 주요 기능으로 포함되었다.[3]

3. 1. 언어 기능


  • 인라인 함수 도입[3][4]
  • 변수 선언을 파일 범위나 복합 명령어의 시작 부분에서만 할 필요가 없어짐[3][4]
  • 새로운 자료형 도입: long long int, 선택적인 확장 정수형, 명시적 불리언 자료형, 복소수를 나타내기 위한 complex[3][4]
  • 가변 길이 배열(VLA: variable-length array) 도입[3]
  • BCPL이나 C++와 같이 //로 시작하는 주석 허용[3][4]
  • snprintf와 같은 새로운 라이브러리 함수 추가[3][4]
  • stdbool.hinttypes.h와 같은 새로운 헤더 파일 추가[3][4]
  • 자료형에 무관하게 동작하는(type-generic) 수학 함수 (tgmath.h에 포함) 추가[3][4]
  • IEEE 부동소수점 자료에 대한 지원 개선[3][4]
  • 지정된 이니셜라이저(designated initializers) 도입[3][4]
  • 복합 리터럴(compound literals) 도입[3]
  • 가변 인수 매크로(Variadic macro) 도입[3][4]
  • 보다 적극적인 코드 최적화를 위한 restrict 한정자 도입[3][4]
  • 유니버설 문자 이름으로 사용자 변수가 표준 문자 집합 이외의 문자를 포함하는 것을 허용[7]
  • 매개변수 선언에서 배열 인덱스에 키워드 static 사용[8]

3. 2. 라이브러리 기능

C99 표준에는 다음과 같은 라이브러리 기능들이 추가되었다.

  • `snprintf`: 버퍼 오버플로우를 방지하는 기능이 있는 출력 함수이다.[3]
  • 새로운 헤더 파일들:
  • `stdbool.h`: 불리언 자료형을 위한 헤더 파일이다.[3]
  • `inttypes.h`: 정수형 자료형 관련 기능을 제공하는 헤더 파일이다.[3]
  • `tgmath.h`: 자료형에 무관하게 동작하는(type-generic) 수학 함수들을 포함한다.[3]
  • `complex.h`: 복소수 자료형을 위한 헤더 파일이다.
  • IEEE 부동소수점 자료에 대한 지원이 개선되었다.[3]
  • 대부분의 최신 프로세서에 존재하는 IEEE 754-1985(IEC 60559라고도 함) 부동 소수점 하드웨어의 기능에 대한 접근을 지원한다.("부록 F IEC 60559 부동 소수점 산술"에 정의됨).[2] IEEE 754 하드웨어가 없는 플랫폼에서도 소프트웨어로 구현할 수 있다.[2]
  • 지정된 초기화 (Designated Initializers): 구조체나 배열의 특정 멤버를 이름으로 초기화할 수 있다.[5]
  • 예: `struct point p = { .x = 1, .y = 2 };`
  • 복합 리터럴 (Compound Literals): 이름 없는 객체를 생성하여 함수에 전달하거나 변수에 할당할 수 있다.[6]
  • 예: `function((struct x) {1, 2});`
  • 가변 인자 매크로 (Variadic Macros): 가변 개수의 인수를 받는 매크로를 정의할 수 있다.[3]

4. C90과의 하위 호환성

C99는 대부분의 영역에서 C90과 하위 호환되지만, 몇 가지 엄격해진 부분이 있다. 특히, 형식 지정자가 빠진 선언을 `int` 자료형으로 더 이상 간주하지 않는다. C 표준 위원회에서는 컴파일러가 형식 지정자를 실수로 빠뜨린 것을 조용히 넘어가기보다는 문제로서 진단하는 것이 더욱 가치가 있다고 보고 이러한 결정을 내렸다.[3] 실제 컴파일러는 형식 지정자가 빠진 것을 오류로 지적할 가능성이 높지만, `int`가 지정된 것으로 보고 번역을 계속할 수도 있다.

또한, C89에서는 선언되지 않은 함수는 반환값 형이 `int`이고, 인수의 수와 형이 임의의 함수로 해석되었지만, C99에서는 문법 위반이 된다.

5. C++와의 호환성

C99 표준의 일부 기능은 C++ 기술 보고서 1C++11과 같은 C++ 표준에 포함되었다.[3] 여기에는 정수형, 헤더 파일, 라이브러리 함수 등이 해당한다.[4] 다만, C++ 표준에 이미 유사한 기능이 포함되어 있어 가변 길이 배열은 포함되지 않았다.

C99의 주요 개념


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++ Builder64비트 모드에서만 지원
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