C11 (C 버전)

(C1X에서 넘어옴)

C11은 ISO/IEC 9899:2011의 줄임말로 C 언어의 최신 개정된 표준을 의미한다. 이전까지 표준이던 C99의 후속으로 최종안인[1]2011년 4월에 제출되었고 검토를 거쳐 2011년 12월 8일에 최종 승인되었다.

PELLES C 8.0에서 완전히 지원하며, GCC 4.6, Clang 3.1, IBM XL C 12.1, MSVC 18 등이 C11의 일부 기능을 지원한다.

2018년 6월에 후속 개정판인 C18 표준이 발표되었다.

C99에서 바뀐 점 편집

  • 정렬 기능. (_Alignas 한정자, alignof 연산자, aligned_alloc 함수 지원 <stdalign.h> 헤더 파일)
  • _Noreturn 함수 한정자.
  • 형에 따른 제네릭 기능으로 _Generic 키워드 추가. 예를 들면 다음 매크로 cbrt(x)x의 형에 따라 cbrtl, cbrtf, cbrt로 호출 됨.
#define cbrt(x) _Generic((x), long double: cbrtl, \
                              default: cbrt, \
                              float: cbrtf)(x)
  • 멀티스레드 지원. (_Thread_local 스토리지 한정자, <threads.h> 헤더에 스레드 생성 관리 함수, 뮤텍스, 컨디션, 로컬 스레드 저장소 함수 지원. 또한 _Atomic 형 한정자와 <stdatomic.h> 헤더를 이용해 아토믹 오퍼레이션 지원)
  • C 유니코드 기술 문서 ISO/IEC TR 19769:2004를 토대로 유니코드 지원 개선 (char16_tchar32_t를 각각 UTF-16/UTF-32 코드 저장용 형으로 할당. 유니코드 변환 함수를 <uchar.h>에 추가 함)[2]
  • 메모리 경계 검사(Memory bounds checking) 인터페이스(Annex K).[3]
  • 이전 C99에서 구식 함수로 규정한 gets()를 제거. 대신 버퍼 안정화/메모리 경계 검사 기능을 추가한 gets_s를 표준에 편입함.
  • 분석 기능의 추가 (Annex L).
  • 부동소수점(float) 형의 특징, 예를 들면 진수 변환, 정수부 얻기 등등을 검사하기 위한 매크로 추가
  • 이름없는 union 또는 struct를 사용하기 더 편리해짐 예시: struct T { int tag; union { float x; int n; }; };.
  • 정적 어셔션(Static assertion)은 이제 전처리기 #if, #error 등이 평가되기 전에 컴파일러가 먼저 형식을 처리한 다음 어셔선 처리가 수행됨
  • fopen() 함수에 배타적 생성 모드 ("…x")가 생김. 이 기능은 POSIX open() 함수의 O_CREAT|O_EXCL기능과 같으며 보통 파일을 배타적으로 생성 할 때 유용하다.
  • exit() 함수와 별개로 최소한 종료 작업만 수행하고 프로그램을 종료하는 새로운 함수 quick_exit()의 추가.[4]
  • 복소수를 생성하는 매크로의 추가[5]

버전 감지 편집

C11에서는 표준 매크로 __STD_VERSION__의 값이 201112L로 정의 된다.[6]

#if __STDC_VERSION__ >= 201112L
    // C11 지원
#elif __STDC_VERSION__ >= 199901L
    // C99 지원
#else
    /* C11, C99 지원하지 않음 */
#endif

특정 기능 지원 감지 편집

각 개별 컴파일러가 새로운 표준의 특정 부분만 지원할 경우 다음과 같은 매크로를 통해 기능을 지원하는지 여부를 확인할 수 있다.

C11의 특정 기능 지원 감지
기능 기능 감지용 매크로 C99에 정의됨[7]
분석 기능 (Annex L) __STDC_ANALYZABLE__ 정의되지 않음
메모리 경계 검출 (Annex K) __STDC_LIB_EXT1__ 정의되지 않음
멀티스레드 (<threads.h>) __STDC_NO_THREADS__ 정의되지 않음
아토믹 기능 및 형식 (<stdatomic.h>_Atomic 형 지정자)[8] __STDC_NO_ATOMICS__ 정의되지 않음
IEC 60559 부동소수점 산술 연산자 (Annex F) __STDC_IEC_559__ 일부 지원
IEC 60559 복소수 산술 연산자 (Annex G) __STDC_IEC_559_COMPLEX__ 일부 지원
복소수 형 (<complex.h>) __STDC_NO_COMPLEX__ 필수 사항
가변 길이 배열[9] __STDC_NO_VLA__ 필수 사항

같이 보기 편집

각주 편집

  1. WG14 N1570 Committee Draft — April 12, 2011
  2. WG14 N1286 — "On Support for TR-19769 and New Character Types", Nick Stoughton, Larry Dwyer
  3. Berin Babcock-McConnell. “API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size”. 2011년 9월 29일에 원본 문서에서 보존된 문서. 2011년 9월 22일에 확인함. 
  4. WG14 N1327 Abandoning a Process
  5. WG14 N1464 Creation of complex value
  6. “Defect report #411”. ISO/IEC JTC1/SC22/WG14 - C. February 2012. 2012년 5월 4일에 확인함. 
  7. ISO 9899:1999 6.10.8 Predefined macro names
  8. WG14 N1558 Mar 14-18 meeting minutes (draft)
  9. ISO 9899:2011 Programming Languages - C 6.7.6.2 4

외부 링크 편집