#keywords C,language,programming,standard,kenneth,dennis,ritchie,ansi,c++,gcc #title C언어 [wiki:Home 대문] / [wiki:CategoryProgramming 프로그래밍] / [wiki:LanguageC C언어] ---- == [wiki:LanguageC C언어] == * 작성자 조재혁([mailto:minzkn@minzkn.com]) * 고친과정 2014년 12월 27일 : 인터넷 자료를 수집인용하여 처음씀 [[TableOfContents]] === 시작하기전에 === [wiki:LanguageC C언어]는 1972년 케니스 레인 톰프슨(Kenneth Lane Thompson)과 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 벨 연구소에서 일할 당시 새로 개발된 유닉스 운영 체제에서 사용하기 위해 개발한 프로그래밍 언어입니다. 케니스 레인 톰프슨(Kenneth Lane Thompson)은 BCPL언어를 필요에 맞추어 개조해서 "B"언어(언어를 개발한 벨 연구소의 B를 따서)라 명명했고, 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 이것을 개선하여 C언어가 탄생하게 되었습니다. 오늘날 많은 프로그램들이 [wiki:LanguageC C언어]를 사용하여 만들어졌고 수 많은 다른 언어들에 큰 영향을 주었습니다. 이 문서는 이렇게 많이 사용되는 [wiki:LanguageC C언어]의 정확한 이해를 위해서 작성되었습니다. 대부분의 내용은 맨 아래의 참고자료를 인용하여 작성되었으며 각 내용이 해석에 따라 잘못 이해한 부분도 있을 수 있습니다. 혹시 잘못된 부분이나 정정이 필요한 경우 알려주시면 감사하겠습니다. === K&R C === 1978년에 브라이언 윌슨 커니핸 (Brian Wilson Kernighan)과 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)가 "The C Programming Language"라는 책의 초판을 출간했으며 이후 이 책은 두 사람의 앞 글자만 따서 "K&R"로 불리우게 되었습니다. 공식적인 표준은 아니지만 이 책은 [wiki:LanguageC C언어]의 표준과 같은 역할을 했었기에 "K&R C"란 명칭으로 초기 [wiki:LanguageC C언어]의 표준으로 사용되었습니다. 이후 이 책의 2판에서는 ANSI-C 표준을 다루게 되었습니다. === ANSI-C === 첫 [wiki:LanguageC C언어]의 표준은 ANSI에 의해서 1983년 "X3J11" 으로 처음 다루게 되었습니다. 이후 ANSI에 의해서 채택된 국제 표준화기구인 ISO에 의해서 개정되어 다루게 됩니다. ==== C89 ==== 1989년 "ANSI X3.159-1989 Programming Language C."으로 표준으로 자리를 잡게 되며 이것을 흔희들 "ANSI C"로 많이 부르게 됩니다. ==== C90 ==== 1990년 서식만 변경한 형태의 "ISO/IEC 9899 : C90" 으로 다루게 되었으며 C89와 C90은 본질적으로 같은 언어입니다. ==== C95 ==== 1995년에 1990년의 C 표준에 대한 규약 수정안 1이 출판되었는데 "ISO/IEC 9899/AMD1:1995 - C95"로 불려지게 됩니다. * 표준 Library에서 Multi-byte 와 Wide character 에 대한 지원이 개선되었습니다. * 이중자(Digraphs) 를 추가하였습니다. (참고: [wiki:TrigraphSequence C언어에서의 삼중자 (Trigraph Sequence)]) * Macro에서 Operators를 정의하였습니다. (예를 들자면 &&) * {{{__STDC_VERSION__}}} 에대한 표준 Macro를 정의하였습니다. {{{#!enscript c #if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 199409L /* C95 compatible source code. */ #endif }}} ==== 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 지원이 가능함을 나타냅니다. {{{#!enscript c #if __STDC_VERSION__ >= 199901L /* C99 supported */ #else /* C99 not supported */ #endif }}} ==== C11 ==== 2011년 [wiki:LanguageC C언어]의 새로운 표준안으로 "ISO/IEC 9899:2011 - C11"이 발표되었습니다. * 정렬 기능(_Alignas 한정자, alignof 연산자, aligned_alloc 함수 지원 헤더 파일) 이 추가되었습니다. * _Noreturn 함수 한정자가 추가되었습니다. * 형에 따른 제네릭 기능으로 _Generic 키워드 추가되었습니다. 예를 들면 다음 매크로 cbrt(x)는 x의 형에 따라 cbrtl, cbrtf, cbrt로 호출 됩니다. {{{#!enscript c #define cbrt(X) \ _Generic((X), \ long double: cbrtl, \ default: cbrt, \ float: cbrtf) \ (X) }}} * 멀티스레드 지원에 대한 사항이 추가되었습니다. (_Thread_local 스토리지 한정자, 헤더에 스레드 생성 관리 함수, 뮤텍스, 컨디션, 로컬 스레드 저장소 함수 지원. 또한 _Atomic 형 한정자와 헤더를 이용해 아토믹 오퍼레이션 지원) * C 유니코드 기술 문서 "ISO/IEC TR 19769:2004"를 토대로 유니코드 지원이 개선되었습니다. (char16_t와 char32_t를 각각 UTF-16/UTF-32 코드 저장용 형으로 할당. 유니코드 변환 함수를 에 추가 함) * 메모리 경계 검사(Memory bounds checing) 인터페이스(Annex K) * 이전 C99에서 구식 함수로 규정한 gets()를 제거하였으며 대신 버퍼 안정화/메모리 경계 검사 기능을 추가한 gets_s를 표준에 편입하였습니다. * 분석 기능의 추가 (Annex L) * 부동 소수점(float) 형의 특징, 예를 들면 진수 변환, 정수부 얻기 등등을 검사하기 위한 매크로가 추가되었습니다. * 이름없는 union 또는 struct를 사용하기 더 편리해졌습니다. {{{#!enscript c 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__}}} ||정의되지 않음 || ||멀티스레드 () ||{{{__STDC_NO_THREADS__}}} ||정의되지 않음 || ||아토믹 기능 및 형식 ( 및 _Atomic 형 지정자) ||{{{__STDC_NO_ATOMICS__}}} ||정의되지 않음 || ||IEC 60559 부동소수점 산술 연산자 (Annex F) ||{{{__STDC_IEC_559__}}} ||일부 지원 || ||IEC 60559 복소수 산술 연산자 (Annex G) ||{{{__STDC_IEC_559_COMPLEX__}}} ||일부 지원 || ||복소수 형 () ||{{{__STDC_NO_COMPLEX__}}} ||필수 사항 || ||가변 길이 배열 ||{{{__STDC_NO_VLA__}}} ||필수 사항 || * {{{__STDC_VERSION__}}}가 201112L로 정의되면 C11 지원이 가능함을 나타냅니다. {{{#!enscript c #if __STDC_VERSION__ >= 201112L // C11 지원 #elif __STDC_VERSION__ >= 199901L // C99 지원 #else /* C11, C99 지원하지 않음 */ #endif }}} === 참고자료 === * [^http://en.wikipedia.org/wiki/C_(programming_language)] * [^http://en.wikipedia.org/wiki/Brian_Kernighan 케니스 레인 톰프슨(Kenneth Lane Thompson)에 대하여] * [^http://www.cs.bell-labs.com/who/ken/ 케니스 레인 톰프슨(Kenneth Lane Thompson)의 벨 연구소 페이지] * [^http://en.wikipedia.org/wiki/Dennis_Ritchie 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)에 대하여] * [^http://www.cs.bell-labs.com/who/dmr/ 데니스 매캘리스테어 리치(Dennis MacAlistair Ritchie)의 홈페이지] * [^http://en.wikipedia.org/wiki/Brian_Kernighan 브라이언 윌슨 커니핸 (Brian Wilson Kernighan)에 대하여] * [^http://en.wikipedia.org/wiki/ANSI_C] * [^http://en.wikipedia.org/wiki/C99] * [^http://en.wikipedia.org/wiki/C_preprocessor] * [^http://nadeausoftware.com/articles/2012/02/c_c_tip_how_detect_processor_type_using_compiler_predefined_macros C/C++ tip: How to detect the processor type using compiler predefined macros] * [^http://nadeausoftware.com/articles/2012/10/c_c_tip_how_detect_compiler_name_and_version_using_compiler_predefined_macros C/C++ tip: How to detect the compiler name and version using compiler predefined macros] * [^http://nadeausoftware.com/articles/2012/01/c_c_tip_how_use_compiler_predefined_macros_detect_operating_system C/C++ tip: How to detect the operating system type using compiler predefined macros]