C99에 추가되거나 변경된 기능
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 한정자
C99 버전 검사 방법
표준 매크로 __STDC_VERSION__가 199901L로 정의되면 C99 지원이 가능함을 나타낸다. C90에서의 __STDC__ 매크로처럼, __STDC_VERSION__은 C90과 C99간에 다르게 컴파일할 수 있는 코드를 작성하는데 사용할 수 있다.
#if __STDC_VERSION__ >= 199901L
/* "inline" is a keyword */
#else
# define inline /* nothing */
#endif
C11에 추가되거나 변경된 기능
- 정렬 기능. (_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_t와 char32_t를 각각 UTF-16/UTF-32 코드 저장용 형으로 할당. 유니코드 변환 함수를 <uchar.h>에 추가 함)
- 메모리 경계 검사(Memory bounds checing) 인터페이스(Annex K).
- 이전 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()의 추가.
- 복소수를 생성하는 매크로의 추가
C11 버전 검사 방법
C11에서는 표준 매크로 __STD_VERSION__의 값이 201112L로 정의 된다.
#if __STDC_VERSION__ >= 201112L
// C11 지원
#elif __STDC_VERSION__ >= 199901L
// C99 지원
#else
/* C11, C99 지원하지 않음 */
#endif
C11의 특정 기능 지원 감지
각 개별 컴파일러가 새로운 표준의 특정 부분만 지원할 경우 다음과 같은 매크로를 통해 기능을 지원하는지 여부를 확인할 수 있다.
분석 기능 (Annex L) : __STDC_ANALYZABLE__ : C99에는 정의되지 않음
메모리 경계 검출 (Annex K) : __STDC_LIB_EXT1__ : C99에는 정의되지 않음
멀티스레드 (<threads.h>) : __STDC_NO_THREADS__ : C99에는 정의되지 않음
아토믹 기능 및 형식 (<stdatomic.h> 및 _Atomic 형 지정자): __STDC_NO_ATOMICS__ : C99에는 정의되지 않음
IEC 60559 부동소수점 산술 연산자 (Annex F) : __STDC_IEC_559__ : C99에서 일부 지원
IEC 60559 복소수 산술 연산자 (Annex G) : __STDC_IEC_559_COMPLEX__ : C99에서 일부 지원
복소수 형 (<complex.h>) : __STDC_NO_COMPLEX__ : C99에서 지원 사항
가변 길이 배열 : __STDC_NO_VLA__ : C99에서 지원 사항
'Programming > C & C++' 카테고리의 다른 글
ssize_t, size_t 그리고 pid_t (0) | 2017.10.22 |
---|---|
C 와 C++에서 구조체 정의의 차이점 (0) | 2017.10.22 |
Application development on AIX (0) | 2017.10.22 |
함수와 매크로에 대한 정리 (0) | 2017.10.22 |
Linux Thread Programming에 대해서... (0) | 2017.10.22 |