맨위로가기

C11 (C 버전)

"오늘의AI위키"는 AI 기술로 일관성 있고 체계적인 최신 지식을 제공하는 혁신 플랫폼입니다.
"오늘의AI위키"의 AI를 통해 더욱 풍부하고 폭넓은 지식 경험을 누리세요.

1. 개요

C11은 2011년에 발표된 C 프로그래밍 언어의 표준으로, C99에 비해 데이터 구조 정렬 제어, `_Noreturn` 함수 지정자, 형식-일반 표현식, 멀티스레딩 지원, 유니코드 지원 개선 등의 핵심 기능이 추가되었다. 또한, gets 함수 제거, 메모리 경계 검사 인터페이스 추가, 선택적 기능 도입 등 다양한 변경 사항이 포함되었다. C11은 선택적 기능을 통해 컴파일러 구현의 유연성을 높였으며, GCC, Clang, IBM XL C, Microsoft Visual C++ 등 다양한 컴파일러에서 지원된다. 그러나 경계 검사 인터페이스는 논란의 대상이며, 다음 표준에서 폐지될 수 있다는 제안이 있다.

더 읽어볼만한 페이지

  • 프로그래밍 언어 표준 - ISO/IEC JTC 1/SC 22
    ISO/IEC JTC 1/SC 22는 프로그래밍 언어, 환경 및 시스템 소프트웨어 인터페이스 분야의 표준화를 담당하는 ISO/IEC JTC 1의 하위 위원회이며, 다양한 프로그래밍 언어와 시스템 소프트웨어 인터페이스의 표준화를 목표로 1985년에 설립되었다.
  • 프로그래밍 언어 표준 - C99
    C99는 1999년 ISO/IEC 9899:1999로 출판된 C 프로그래밍 언어의 표준으로, 인라인 함수, 가변 길이 배열, `//` 주석 등 새로운 기능들을 추가하고 IEEE 부동소수점 자료 지원을 개선했으며 C90과 하위 호환성을 가지면서 C++와의 호환성을 고려했다.
  • C 프로그래밍 언어 - C (프로그래밍 언어)
    C는 하드웨어 제어와 이식성이 뛰어난 고급 절차적 프로그래밍 언어로서, 다양한 분야에서 사용되며 후속 언어에 영향을 주었고, 성능과 효율성이 높지만 안전성 문제 개선이 필요한 언어이다.
  • C 프로그래밍 언어 - 헤더 파일
    헤더 파일은 프로그래밍 언어에서 코드 재사용성, 모듈화, 컴파일 시간 단축에 기여하며 함수 프로토타입, 변수 선언 등을 포함하고 `#include` 지시어로 소스 코드에 포함되어 사용되는 파일이다.
C11 (C 버전)
C11 표준
표준 명칭ISO/IEC 9899:2011
개발ISO/IEC JTC1/SC22/WG14
기반C99
후속C17
발표일2011년 12월 8일
표준 유형ISO 표준
언어C
주요 특징
다중 스레딩 지원다중 스레딩을 위한 표준 라이브러리 지원
형식 지정자_Generic 키워드를 사용한 형식 지정자
정적 분석정적 분석을 위한 pragma STDC 지시문
함수 안전성함수 안전성을 위한 새로운 함수 (__STDC_WANT_LIB_EXT1__)
유니코드 지원유니코드 6.0 지원
컴파일 시간 검사컴파일 시간 검사를 위한 _Static_assert
익명 구조체/공용체익명 구조체/공용체 지원
배타적 접근 모드파일 배타적 접근 모드 (fopen 함수)
경계 검사 인터페이스확장된 경계 검사 인터페이스
부동 소수점 환경 접근부동 소수점 환경에 대한 향상된 접근
복소수복소수 연산 개선
gets 함수 제거gets 함수 제거 (보안 취약성)
alignas 키워드alignas 키워드를 사용한 메모리 정렬 지정
참고 자료
공식 표준 문서ISO/IEC 9899:2011

2. C99에서 변경된 사항

C99 언어 및 라이브러리 사양에 대한 C11 표준의 주요 변경 사항은 다음과 같다.


  • 데이터 구조 정렬: `_Alignas` 지정자, `_Alignof` 연산자, `aligned_alloc` 함수, `<stdalign.h>` 헤더를 통해 데이터 구조 정렬을 제어한다.
  • `_Noreturn` 함수 지정자: `_Noreturn` 함수 지정자와 `<stdnoreturn.h>` 헤더를 통해 반환 값이 없는 함수를 지정한다.
  • 형식-일반 표현식: `_Generic` 키워드를 사용하여 형식에 따라 다른 코드를 실행하는 표현식을 작성한다.
  • 다중 스레딩 지원: `_Thread_local` 저장 클래스 지정자, `<threads.h>` 헤더 (스레드 생성/관리 함수, 뮤텍스, 조건 변수, 스레드별 스토리지 기능 포함), `<stdatomic.h>` 헤더 (C11 메모리 모델을 지원하는 원자적 연산)를 통해 다중 스레딩 프로그래밍을 지원한다.
  • 유니코드 지원 개선: C 유니코드 기술 보고서 ISO/IEC TR 19769:2004를 기반으로 `char16_t` 및 `char32_t` 형식 (UTF-16/UTF-32 인코딩 데이터 저장), `<uchar.h>`의 변환 함수, `u` 및 `U` 문자열 리터럴 접두사, `u8` 접두사 (UTF-8 인코딩 리터럴)를 통해 유니코드 지원을 개선했다.
  • `gets()` 함수 제거: 더 안전한 `fgets` 함수를 사용한다.
  • 경계 검사 인터페이스: 부록 K에 추가되었다.[5]
  • 분석 가능성 기능: 부록 L에 추가되었다.
  • 부동 소수점 형식 특성 쿼리: 비정규 부동 소수점 숫자 및 형식이 저장할 수 있는 소수 자릿수와 관련된 매크로가 추가되었다.
  • 익명 구조체 및 공용체: 중첩된 구조체나 공용체에서 유용하게 사용된다.
  • 정적 어설션: 컴파일 시간에 형식을 검사하고 어설션을 처리한다.
  • `fopen` 독점 생성 모드: `fopen` 함수에 `"…x"` 접미사를 추가하여 파일을 배타적으로 생성한다.
  • `quick_exit` 함수: 최소한의 초기화 해제만 수행하고 프로그램을 종료한다.[6]
  • `timespec_get` 함수: `<time.h>`에 POSIX 호환성이 있는 `timespec_get` 함수와 해당 구조체가 추가되었다.
  • 복소수 값 구성 매크로: 복소수 값 구성을 위한 매크로가 추가되었다.


위에 언급된 변경 사항들에 대한 구체적인 내용은 핵심 기능 추가 및 기타 변경 사항 하위 섹션을 참고할 수 있다.

2. 1. 핵심 기능 추가


  • 데이터 구조 정렬: _Alignas 지정자, _Alignof 연산자, aligned_alloc 함수, 헤더 파일을 통해 데이터 구조의 정렬을 세밀하게 제어할 수 있게 되었다.
  • `_Noreturn` 함수 지정자: _Noreturn 함수 지정자와 헤더 파일을 통해 반환 값이 없는 함수를 명시적으로 지정할 수 있다.
  • 형식-일반 표현식: _Generic 키워드를 사용하여 형식에 따라 다른 코드를 실행하는 형식-일반 표현식을 작성할 수 있다. 예를 들어, cbrt(x) 매크로는 x의 형식에 따라 cbrtl(x), cbrt(x), 또는 cbrtf(x)로 자동 변환된다.

```c

#define cbrt(x) _Generic((x), long double: cbrtl, \

default: cbrt, \

float: cbrtf)(x)

```

  • 멀티스레딩 지원: _Thread_local 저장 클래스 지정자, 헤더 파일 (스레드 생성/관리 함수, 뮤텍스, 조건 변수, 스레드별 스토리지 기능 포함), 헤더 파일 (C11 메모리 모델을 지원하는 원자적 연산)을 통해 멀티스레딩 프로그래밍을 지원한다.[4]
  • 유니코드 지원 개선: C 유니코드 기술 보고서 ISO/IEC TR 19769:2004를 기반으로 char16_tchar32_t 형식 (UTF-16/UTF-32 인코딩 데이터 저장), 의 변환 함수, uU 문자열 리터럴 접두사, u8 접두사 (UTF-8 인코딩 리터럴)를 통해 유니코드 지원이 개선되었다.

2. 2. 기타 변경 사항


  • C99 표준에서 사용이 중단되었던 `gets()` 함수가 제거되고, 더 안전한 `fgets()` 함수를 사용하거나 버퍼 안정화/메모리 경계 검사 기능을 추가한 `gets_s` 함수가 표준에 편입되었다.[29]
  • 메모리 경계 검사를 위한 인터페이스 (Annex K)가 추가되었다.[29]
  • 분석 가능성 기능 (Annex L)이 추가되었다.
  • 비정규 부동 소수점 숫자 및 형식이 저장할 수 있는 소수 자릿수와 관련된 부동 소수점 형식의 특성을 쿼리하기 위한 매크로가 추가되었다.
  • 중첩된 구조체나 공용체에서 유용한 익명 ''구조체'' 및 ''공용체''를 사용할 수 있게 되었다. 예를 들어 `struct T { int tag; union { float x; int n; }; };` 와 같이 사용할 수 있다.
  • 컴파일 시간에 형식을 검사하고 어설션을 처리하는 정적 어설션 기능이 추가되었다.
  • `fopen` 함수에 배타적 생성 모드 ("…x" 접미사)가 추가되어, POSIX open() 함수의 O_CREAT|O_EXCL 기능과 유사하게 파일을 배타적으로 생성할 수 있다.
  • 프로그램 종료를 위한 quick_exit 함수가 추가되어, 최소한의 초기화 해제만 수행하고 프로그램을 종료할 수 있다.[30]
  • POSIX 호환성이 있는 timespec_get 함수와 해당 구조체가 추가되었다.
  • 복소수 값 구성을 위한 매크로가 추가되었다.

3. 선택적 기능

C11 표준은 구현 시 표준의 특정 부분을 지원하지 않아도 되도록 허용하며, 여기에는 C99에서 지원이 의무였던 일부 기능도 포함된다. 프로그램은 미리 정의된 매크로를 사용하여 구현에서 특정 기능을 지원하는지 여부를 확인할 수 있다.

3. 1. C11 선택적 기능 목록

C11 표준은 구현 시 일부 기능을 지원하지 않아도 되도록 허용하며, 여기에는 C99에서 필수였던 기능도 포함된다. 프로그램은 미리 정의된 매크로를 사용하여 특정 기능 지원 여부를 확인할 수 있다.

C11 선택적 기능 및 확인 매크로
기능기능 확인 매크로C99에서의 지원 여부
분석 가능성 (Annex L)__STDC_ANALYZABLE__정의되지 않음
경계 검사 인터페이스 (Annex K)__STDC_LIB_EXT1__정의되지 않음
멀티스레딩 ()__STDC_NO_THREADS__정의되지 않음
원자 연산 기본형 및 자료형 (_Atomic 자료형 한정자)[32]__STDC_NO_ATOMICS__정의되지 않음
IEC 60559 부동 소수점 산술 (Annex F)__STDC_IEC_559__일부 지원
IEC 60559 호환 복소수 산술 (Annex G)__STDC_IEC_559_COMPLEX__일부 지원
복소수 자료형 ()__STDC_NO_COMPLEX__필수 사항
가변 길이 배열[33]__STDC_NO_VLA__필수 사항


4. 컴파일러 지원

GCC 버전 4.6,[9] Clang 버전 3.1,[10] IBM XL C 버전 12.1,[11] Microsoft Visual C++ VS 2019 (16.8)[12]부터 C11의 일부 기능이 지원된다.

5. 비판

선택적 기능인 경계 검사 인터페이스(부록 K)는 여전히 논란의 대상이며 널리 구현되지 않아, 다음 표준 개정에서 폐지되거나 제거될 수 있다는 제안이 나왔다. 이 인터페이스의 주요 지지자인 마이크로소프트조차도 정의를 따르지 않는다는 비판이 있다.[13] 또한, 부록 K에는 vasprintf|영어 및 open_memstream|영어과 같은 더욱 유용한 TR24731-2(동적 할당 함수)가 포함되어 있지 않다.[14] 몇 안 되는 오픈 소스 구현으로는 Open Watcom C/C++의 "Safer C" 라이브러리[15] 및 safeclib가 있다.[16]

참조

[1] 웹사이트 ISO/IEC 9899:2011 - Information technology -- Programming languages -- C https://www.iso.org/[...]
[2] 웹사이트 Subsetting the C Standard http://www.open-std.[...]
[3] 웹사이트 Defect report #411 http://www.open-std.[...] ISO/IEC JTC1/SC22/WG14 - C 2012-05-04
[4] 웹사이트 Atomic operations library - cppreference.com http://en.cppreferen[...]
[5] 웹사이트 API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size https://www.secureco[...]
[6] 웹사이트 Abandoning a Process http://www.open-std.[...]
[7] 웹사이트 WG14 N1558 Mar 14-18 meeting minutes (draft) http://www.open-std.[...]
[8] 문서 ISO 9899:2011 Programming Languages - C 6.7.6.2 4
[9] 웹사이트 GCC 4.6 Release Series — Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF) https://gcc.gnu.org/[...]
[10] 웹사이트 Clang 3.1 Release Notes http://llvm.org/rele[...]
[11] 웹사이트 Support for ISO C11 added to IBM XL C/C++ compilers http://www.ibm.com/d[...] 2014-04-17
[12] 웹사이트 C11 and C17 Standard Support Arriving in MSVC https://devblogs.mic[...] 2020-09-14
[13] 웹사이트 c - Do you use the TR 24731 'safe' functions? https://stackoverflo[...]
[14] 웹사이트 c - Do you use the TR 24731 'safe' functions? https://stackoverflo[...]
[15] 웹사이트 Safer C Library - Open Watcom http://openwatcom.or[...] 2015-05-03
[16] 웹사이트 safec: Safe C Library - README https://rurban.githu[...]
[17] 문서 ISO/IEC 9899:2011 - Information technology - Programming languages - C http://www.iso.org/i[...]
[18] 문서 WG14 N1460 Subsetting the C Standard http://www.open-std.[...]
[19] 웹사이트 Defect report #411 http://www.open-std.[...] ISO/IEC JTC1/SC22/WG14 - C 2012-05-04
[20] 문서 GCC 4.6 Release Series ? Changes, New Features, and Fixes - GNU Project - Free Software Foundation (FSF) https://gcc.gnu.org/[...]
[21] 문서 Clang 3.1 Release Notes http://llvm.org/rele[...]
[22] 문서 Microsoft C++ 言語の準拠表 | Microsoft Docs https://docs.microso[...]
[23] 문서 Support for ISO C11 added to IBM XL C/C++ compilers http://www.ibm.com/d[...]
[24] 웹사이트 API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size https://www.secureco[...] 2017-12-05
[25] 문서 WG14 N1327 Abandoning a Process http://www.open-std.[...]
[26] 문서 WG14 N1558 Mar 14-18 meeting minutes (draft) http://www.open-std.[...]
[27] 문서 ISO 9899:2011 Programming Languages - C 6.7.6.2 4
[28] 문서 Open Watcom Safer C Library https://web.archive.[...]
[29] 웹인용 API02-C. Functions that read or write to or from an array should take an argument to specify the source or target size https://www.secureco[...] 2011-09-22
[30] 문서 WG14 N1327 Abandoning a Process http://www.open-std.[...]
[31] 웹인용 Defect report #411 http://www.open-std.[...] ISO/IEC JTC1/SC22/WG14 - C 2012-05-04
[32] 문서 WG14 N1558 Mar 14-18 meeting minutes (draft) http://www.open-std.[...]
[33] 문서 ISO 9899:2011 Programming Languages - C 6.7.6.2 4



본 사이트는 AI가 위키백과와 뉴스 기사,정부 간행물,학술 논문등을 바탕으로 정보를 가공하여 제공하는 백과사전형 서비스입니다.
모든 문서는 AI에 의해 자동 생성되며, CC BY-SA 4.0 라이선스에 따라 이용할 수 있습니다.
하지만, 위키백과나 뉴스 기사 자체에 오류, 부정확한 정보, 또는 가짜 뉴스가 포함될 수 있으며, AI는 이러한 내용을 완벽하게 걸러내지 못할 수 있습니다.
따라서 제공되는 정보에 일부 오류나 편향이 있을 수 있으므로, 중요한 정보는 반드시 다른 출처를 통해 교차 검증하시기 바랍니다.

문의하기 : help@durumis.com