C99

C99는 C 언어의 현대 개정판이자, C 언어 표준의 과거판인 ISO/IEC 9899:1999의 비공식 이름이다.

역사 
ANSI의 표준화 이후 C 언어 표준이 상대적으로 정적으로 남아 있었던 동안, C++는 표준화를 위하여 계속 진화하고 있었다. 1995년에 1990년의 C 표준에 대한 규약 수정안 1이 출판되었는데, 이는 약간의 세부 사항을 교정하고 국제적 문자 세트에 대한 보다 확장된 지원을 위한 것이었다. C 표준은 1990년대 후반에 더 개정되어, 1999년 ISO/IEC 9899:1999가 출간되었고, 여기서 명시한 규범을 흔히 C99라 부른다. 이는 기술적 교정에 의하여 현재까지 3번의 수정이 있었다. 국제 C 표준은 실무 그룹 ISO/IEC JTC1/SC22/WG14에 의해 관리되고 있다.

새로운 기능 
C99는 다음과 같은 기능들을 포함하고 있다. 이들 중 일부는 이미 일부 컴파일러에 확장 기능으로서 포함된 적이 있다.
 인라인 함수의 도입
 변수의 선언은 더이상 파일 범위나 복합 명령어의 시작에서만 할 필요가 없다.
 long long int, 선택적인 확장 정수형, 명시적 불리언 자료형, 그리고 복소수를 나타내기 위한 complex 자료형 등 새로운 자료형 도입
 가변 길이 배열(VLA: variable-length array)
float read_and_process(int n)
{
    float vals[n];

    for (int i = 0; i < n; i++)
        vals[i] = read_val();
    return process(vals, n);
}
 BCPL이나 C++와 같은 //로 시작하는 주석들
 snprintf와 같은 새로운 라이브러리 함수
 stdbool.h 및 inttypes.h와 같은 새로운 헤더 파일들
 자료형에 무관하게 동작하는(type-generic) 수학 함수들 (tgmath.h에 포함)
 IEEE 부동소수점 자료에 대한 개선된 지원
 지정된 이니셜라이저(designated initializers)
 복합 리터럴(compound literals)
 가변 인수 매크로(Variadic macro)의 도입
 보다 적극적인 코드 최적화를 위한 restrict 한정자

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

C++와의 호환성 
C99 표준의 일부는 TR1이나 C++11 같은 C++의 제안된 확장에 포함되어 있다. 정수형, 헤더 파일, 라이브러리 함수 등도 제안에 포함되어 있다.

버전 감지 
표준 매크로 __STDC_VERSION__가 199901L로 정의되면 C99 지원이 가능함을 나타낸다. C90에서의  매크로처럼, __STDC_VERSION__은 C90과 C99간에 다르게 컴파일할 수 있는 코드를 작성하는데 사용할 수 있다.
#if __STDC_VERSION__ >= 199901L
  /* "inline" is a keyword */
#else
# define inline /* nothing */
#endif

주요 컴파일러들의 지원 
GCC 등의 C 컴파일러들은 이제 C99의 새로운 기능들을 대부분 지원한다. 그러나, 마이크로소프트나 볼랜드 등의 업체들은 C99를 별로 지원하지 않았는데, 이는 비슷한 기능 개선이 이미 되어 있는 C++에 치중했기 때문이다.

GCC의 경우, C99의 기능 명세를 상당히 많이 지원하지만(2008년 11월 현재 41개), 아직 완벽한 지원은 아니다. 2008년 11월을 기준으로 9개의 기능들은 제대로 작동하지 않거나 지원되지 않는다.

썬 마이크로시스템즈는 자사의 썬 스튜디오가 C99의 기능들을 완벽히 지원한다고 주장하고 있다.

C의 인터프리터인 Ch도 C99의 주요 기능들을 지원한다.

각주

외부 링크 
 Final version of the C99 standard with corrigenda TC1, TC2, and TC3 included, formatted as a draft
  New in C9X

C 프로그래밍 언어
프로그래밍 언어 표준