C11 (C 버전)
"오늘의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_t
및char32_t
형식 (UTF-16/UTF-32 인코딩 데이터 저장),
의 변환 함수,u
및U
문자열 리터럴 접두사,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"
접미사)가 추가되어, POSIXopen()
함수의O_CREAT|O_EXCL
기능과 유사하게 파일을 배타적으로 생성할 수 있다. - 프로그램 종료를 위한
quick_exit
함수가 추가되어, 최소한의 초기화 해제만 수행하고 프로그램을 종료할 수 있다.[30]
에 POSIX 호환성이 있는timespec_get
함수와 해당 구조체가 추가되었다.- 복소수 값 구성을 위한 매크로가 추가되었다.
3. 선택적 기능
C11 표준은 구현 시 표준의 특정 부분을 지원하지 않아도 되도록 허용하며, 여기에는 C99에서 지원이 의무였던 일부 기능도 포함된다. 프로그램은 미리 정의된 매크로를 사용하여 구현에서 특정 기능을 지원하는지 여부를 확인할 수 있다.
3. 1. C11 선택적 기능 목록
C11 표준은 구현 시 일부 기능을 지원하지 않아도 되도록 허용하며, 여기에는 C99에서 필수였던 기능도 포함된다. 프로그램은 미리 정의된 매크로를 사용하여 특정 기능 지원 여부를 확인할 수 있다.기능 | 기능 확인 매크로 | 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