| 검색 | ?

C언어

1.1. 시작하기전에

C언어는 1972년 케니스 레인 톰프슨(Kenneth Lane Thompson)과 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어입니다.

케니스 레인 톰프슨(Kenneth Lane Thompson)은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 이것을 개선하여 C언어가 탄생하게 되었습니다.

오늘날 많은 프로그램들이 C언어를 사용하여 만들어졌고 수 많은 다른 언어들에 큰 영향을 주었습니다.

이 문서는 이렇게 많이 사용되는 C언어의 정확한 이해를 위해서 작성되었습니다. 대부분의 내용은 맨 아래의 참고자료를 인용하여 작성되었으며 각 내용이 해석에 따라 잘못 이해한 부분도 있을 수 있습니다. 혹시 잘못된 부분이나 정정이 필요한 경우 알려주시면 감사하겠습니다.

1.2. K&R C

1978년에 브라이언 윌슨 커니핸 (Brian Wilson Kernighan)과 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 "The C Programming Language"라는 책의 초판을 출간했으며 이후 이 책은 두 사람의 앞 글자만 따서 "K&R"로 불리우게 되었습니다.

공식적인 표준은 아니지만 이 책은 C언어의 표준과 같은 역할을 했었기에 "K&R C"란 명칭으로 초기 C언어의 표준으로 사용되었습니다.

이후 이 책의 2판에서는 ANSI-C 표준을 다루게 되었습니다.

1.3. ANSI-C

C언어의 표준은 ANSI에 의해서 1983년 "X3J11" 으로 처음 다루게 되었습니다.

이후 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
    


Copyright ⓒ MINZKN.COM
All Rights Reserved.