C언어
- 작성자
- 고친과정
2014년 12월 27일 : 인터넷 자료를 수집인용하여 처음씀
1.1. 시작하기전에
C언어는 1972년 케니스 레인 톰프슨(Kenneth Lane Thompson)과 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어입니다.
케니스 레인 톰프슨(Kenneth Lane Thompson)은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 이것을 개선하여 C언어가 탄생하게 되었습니다.
오늘날 많은 프로그램들이 C언어를 사용하여 만들어졌고 수 많은 다른 언어들에 큰 영향을 주었습니다.
이 문서는 이렇게 많이 사용되는 C언어의 정확한 이해를 위해서 작성되었습니다. 대부분의 내용은 맨 아래의 참고자료를 인용하여 작성되었으며 각 내용이 해석에 따라 잘못 이해한 부분도 있을 수 있습니다. 혹시 잘못된 부분이나 정정이 필요한 경우 알려주시면 감사하겠습니다.
케니스 레인 톰프슨(Kenneth Lane Thompson)은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 이것을 개선하여 C언어가 탄생하게 되었습니다.
오늘날 많은 프로그램들이 C언어를 사용하여 만들어졌고 수 많은 다른 언어들에 큰 영향을 주었습니다.
이 문서는 이렇게 많이 사용되는 C언어의 정확한 이해를 위해서 작성되었습니다. 대부분의 내용은 맨 아래의 참고자료를 인용하여 작성되었으며 각 내용이 해석에 따라 잘못 이해한 부분도 있을 수 있습니다. 혹시 잘못된 부분이나 정정이 필요한 경우 알려주시면 감사하겠습니다.
1.2. K&R C
1.3. ANSI-C
첫 C언어의 표준은 ANSI에 의해서 1983년 "X3J11" 으로 처음 다루게 되었습니다.
이후 ANSI에 의해서 채택된 국제 표준화기구인 ISO에 의해서 개정되어 다루게 됩니다.
이후 ANSI에 의해서 채택된 국제 표준화기구인 ISO에 의해서 개정되어 다루게 됩니다.
1.3.1. C89
1989년 "ANSI X3.159-1989 Programming Language C."으로 표준으로 자리를 잡게 되며 이것을 흔희들 "ANSI C"로 많이 부르게 됩니다.
1.3.2. C90
1990년 서식만 변경한 형태의 "ISO/IEC 9899 : C90" 으로 다루게 되었으며 C89와 C90은 본질적으로 같은 언어입니다.
1.3.3. C95
1995년에 1990년의 C 표준에 대한 규약 수정안 1이 출판되었는데 "ISO/IEC 9899/AMD1:1995 - C95"로 불려지게 됩니다.
- 표준 Library에서 Multi-byte 와 Wide character 에 대한 지원이 개선되었습니다.
- 이중자(Digraphs) 를 추가하였습니다. (참고: C언어에서의 삼중자 (Trigraph Sequence))
- Macro에서 Operators를 정의하였습니다. (예를 들자면 &&)
__STDC_VERSION__
에대한 표준 Macro를 정의하였습니다.#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L /* C95 compatible source code. */ #endif
1.3.4. C99
2000년 3월 ANSI에서는 좀더 많은 부분을 개선하여 "ISO/IEC 9899 - C99" 를 채택하게 됩니다.
- inline 함수의 도입
- 변수의 선언은 더이상 파일 범위나 복합 명령어의 시작에서만 할 필요가 없어졌습니다.
- long long int, 선택적인 확장 정수형, 명시적 불린 자료형, 그리고 복소수를 나타내기 위한 complex 자료형 등 새로운 자료형이 도입되었습니다.
- 가변 길이 배열(VLA: variable-length array)을 지원합니다.
//
로 시작하는 주석을 사용할 수 있습니다.- snprintf와 같은 새로운 라이브러리 함수가 추가되었습니다.
- stdbool.h 및 inttypes.h와 같은 새로운 헤더 파일들이 추가되었습니다.
- 자료형에 무관하게 동작하는(type-generic) 수학 함수들 (tgmath.h에 포함)이 추가되었습니다.
- IEEE 부동소수점 자료에 대한 개선된 지원이 추가되었습니다.
- 지정된 이니셜라이저(designated initializers)를 지원합니다.
- 복합 리터럴(compound literals)이 가능합니다.
- 가변 인수 매크로(Variadic macro)가 도입되었습니다.
- 보다 적극적인 코드 최적화를 위한 restrict 한정자를 추가하였습니다.
- C90과의 하위 호환성에 대한 사항 : 대부분 호환되지만 일부 보다 엄격해졌다고 할 수 있습니다.
- C++과의 호환성에 대한 사항 : C99 표준의 일부는 TR1 이나 C++0x 같은 C++의 제안된 확장에 포함되었습니다. 정수형, 헤더 파일, 라이브러리 함수 등도 제안에 포함되어 있습니다.
__STDC_VERSION__
가 199901L로 정의되면 C99 지원이 가능함을 나타냅니다.#if __STDC_VERSION__ >= 199901L /* C99 supported */ #else /* C99 not supported */ #endif
1.3.5. C11
2011년 C언어의 새로운 표준안으로 "ISO/IEC 9899:2011 - 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()가 추가되었습니다.
- 복소수를 생성하는 매크로가 추가되었습니다.
- 각 개별 컴파일러가 새로운 표준의 특정 부분만 지원할 경우 다음과 같은 매크로를 통해 기능을 지원하는지 여부를 확인할 수 있습니다.
기능 기능 감지용 매크로 C99에 정의됨 분석 기능 (Annex L) __STDC_ANALYZABLE__
정의되지 않음 메모리 경계 검출 (Annex K) __STDC_LIB_EXT1__
정의되지 않음 멀티스레드 (<threads.h>) __STDC_NO_THREADS__
정의되지 않음 아토믹 기능 및 형식 (<stdatomic.h> 및 _Atomic 형 지정자) __STDC_NO_ATOMICS__
정의되지 않음 IEC 60559 부동소수점 산술 연산자 (Annex F) __STDC_IEC_559__
일부 지원 IEC 60559 복소수 산술 연산자 (Annex G) __STDC_IEC_559_COMPLEX__
일부 지원 복소수 형 (<complex.h>) __STDC_NO_COMPLEX__
필수 사항 가변 길이 배열 __STDC_NO_VLA__
필수 사항 __STDC_VERSION__
가 201112L로 정의되면 C11 지원이 가능함을 나타냅니다.#if __STDC_VERSION__ >= 201112L // C11 지원 #elif __STDC_VERSION__ >= 199901L // C99 지원 #else /* C11, C99 지원하지 않음 */ #endif
1.4. 참고자료
- http://en.wikipedia.org/wiki/C_(programming_language)
- 케니스 레인 톰프슨(Kenneth Lane Thompson)에 대하여
- 케니스 레인 톰프슨(Kenneth Lane Thompson)의 벨 연구소 페이지
- 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)에 대하여
- 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)의 홈페이지
- 브라이언 윌슨 커니핸 (Brian Wilson Kernighan)에 대하여
- http://en.wikipedia.org/wiki/ANSI_C
- http://en.wikipedia.org/wiki/C99
- http://en.wikipedia.org/wiki/C_preprocessor
- C/C++ tip: How to detect the processor type using compiler predefined macros
- C/C++ tip: How to detect the compiler name and version using compiler predefined macros
- C/C++ tip: How to detect the operating system type using compiler predefined macros