맨위로가기

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` 지시어로 소스 코드에 포함되어 사용되는 파일이다.

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