C99

C99
C99 표준 문서의 표지

C99(이전의 C9X)는 ISO/IEC 9899:1999의 비공식 명칭으로, C 프로그래밍 언어 [1]표준의 과거 버전입니다.이전 버전(C90)을 언어와 표준 라이브러리의 신기능으로 확장하여 IEEE 754-1985 부동소수점 연산 및 컴파일러 [2]테크놀로지 등의 사용 가능한 컴퓨터 하드웨어를 효율적으로 사용할 수 있도록 지원합니다.2011년에 발표된 C 프로그래밍 언어 표준의 C11 버전은 C99를 대체합니다.

역사

ANSI가 1989년에 C 프로그래밍 언어에 대한 공식 표준을 만든 , 1990년에 국제 표준이 된 후, C 언어 사양은 한동안 비교적 정적인 상태를 유지한 반면, C++는 주로 자체 표준화 노력 동안 계속 발전하였다.규범 수정안 1은 1995년에 C에 대한 새로운 표준을 만들었지만, 1989년 표준의 일부 세부사항을 수정하고 국제 문자 집합에 대한 광범위한 지원을 추가하기 위해서였다.이 표준은 1990년대 후반에 추가 개정을 거쳐 1999년에 ISO/IEC 9899:1999를 발표하였고, 2000년 5월에 ANSI 표준으로 채택되었다.해당 버전의 표준에서 정의한 언어를 일반적으로 "C99"라고 합니다.국제 C 표준은 작업 그룹 ISO/IEC JTC1/SC22/WG14에 의해 유지됩니다.

설계.

1999 ISO C.pdf

C99는 대부분의 경우 C89와 하위 호환성이 있지만 어떤 [3]면에서는 더 엄격합니다.

특히, 유형 지정자가 없는 선언은 더 이상 다음을 가지지 않습니다.int암묵적으로 가정하다C 표준 위원회는 컴파일러가 암묵적으로 의존하는 레거시 코드를 묵묵히 처리하는 것보다 유형 지정자의 의도치 않은 누락 여부를 진단하는 것이 더 가치 있다고 결정했다.int실제로 컴파일러는 경고를 표시하고 나서int프로그램 번역을 계속합니다.

C99는 몇 가지 새로운 기능을 도입했습니다.그 중 많은 기능은 이미 여러 [4]컴파일러에서 확장으로 구현되어 있었습니다.

  • 인라인 함수
  • 선언과 코드가 혼재된 경우: 변수 선언이 파일 범위 또는 복합문 시작(블록)으로 제한되지 않습니다.
  • 다음과 같은 몇 가지 새로운 데이터 유형long long int, 옵션의 확장 정수형, 명시적 부울 데이터형complex복소수를 나타내기 위해 타이핑하다
  • 가변장 어레이(이후 C11에서는 구현이 지원하지 않아도 되는 조건부 기능으로 제한됨)
  • 유연한 어레이 멤버
  • 로 시작하는 한 줄짜리 코멘트 지원//BCPL, C++Java와 같이
  • 새로운 라이브러리 기능(예:snprintf
  • 새로운 헤더(예:<stdbool.h>,<complex.h>,<tgmath.h>,그리고.<inttypes.h>
  • 유형 변환 산술(수치) 함수, 입력<tgmath.h> 를 기반으로 산술 라이브러리 함수를 선택합니다.float,double, 또는long double의론 등
  • IEEE 부동소수점 지원 향상
  • 지정된 이니셜라이저(예를 들어 필드 이름으로 구조체를 초기화함)struct point p = { .x = 1, .y = 2 };[5]
  • 복합 리터럴(예를 들어 함수 호출에서 구조를 구성할 수 있습니다.function((struct x) {1, 2})[6]
  • variadic 매크로 지원(변수 인수로 표시)
  • restrict인정에 의해, ANSI[7] C에 비해 FORTRAN이 가지고 있던 컴파일 타임 어레이 액세스의 메리트가 배제되어 보다 적극적인 코드 최적화가 가능하게 됩니다.
  • 범용 문자 이름: 사용자 변수에 표준 문자 집합 이외의 문자를 포함할 수 있습니다.
  • 키워드static매개 변수 선언의[8] 배열 색인에서

C99 표준의 일부는 정수형, 헤더 및 라이브러리 함수를 포함하여 C++ 표준의 현재 버전에 포함되어 있습니다.C++의 Standard Template Library에는 이미 유사한 기능이 포함되어 있기 때문에 가변 길이 배열은 포함되어 있지 않습니다.

IEEE 754 부동소수점 지원

C99의 주요 특징은 숫자 지원이며, 특히 최신 프로세서('Annex F IEC 60559'에서 정의)의 대부분에 존재하는 IEEE 754-1985(IEC 60559) 부동소수점 하드웨어의 기능에 대한 접근을 지원합니다.IEEE 754 하드웨어가 없는 플랫폼에서도 소프트웨어로 [2]구현할 수 있습니다.

IEEE 754 부동소수점 플랫폼:

  • floatIEEE 754 단일 정밀도로 정의됩니다.double이중 정밀도로 정의됩니다.long double는 IEEE 754 확장 정밀도(x86 또는 x86-64 플랫폼에서의 인텔 80비트확장 정밀도 등) 또는 사용 가능한 경우 쿼드 정밀도의 형태로 정의됩니다.그렇지 않으면 배 정밀도가 됩니다.
  • 4개의 산술연산과 제곱근은 IEEE 754에서 정의된 대로 올바르게 반올림됩니다.
    FLT_EVAL_Method 흘러가다 더블 롱 더블
    0 흘러가다 더블 롱 더블
    1 더블 더블 롱 더블
    2 롱 더블 롱 더블 롱 더블
  • 식 평가는 다음 세 가지 정의된 방법 중 하나로 수행되도록 정의되며, 부동소수점 변수가 식에서 먼저 보다 정확한 형식으로 승격되는지 여부를 나타냅니다.FLT_EVAL_METHOD == 2모든 내부 중간 계산이 가능한 경우 기본적으로 고정밀(긴 이중)로 수행됨을 나타냅니다(예: 80비트 이중 확장).FLT_EVAL_METHOD == 1는 (오퍼랜드가 긴 더블이 아닌 한) 모든 내부 중간 표현을 2배의 정밀도로 수행합니다.FLT_EVAL_METHOD == 0는 각 오퍼레이터의 가장 넓은 피연산자의 정밀도로만 각 오퍼레이션을 평가하도록 지정합니다.특정 정밀도의 오퍼랜드에 대한 중간 결과 유형이 인접 표에 요약되어 있습니다.

FLT_EVAL_METHOD == 2수치적으로 불안정한 표현에 영향을 미치는 반올림 오류의 위험을 제한하는 경향이 있으며(IEEE 754 설계 근거 참조), x87 하드웨어에 대해 설계된 기본 방법이지만 부주의한 [9]사용자에게 의도하지 않은 행동을 일으킨다. FLT_EVAL_METHOD == 1원래 K&R C에서 사용된 기본 평가 방법으로, 모든 플로트를 두 배로 표현하도록 촉진했다.FLT_EVAL_METHOD == 0또한 일반적으로 사용되며 오퍼랜드의 엄밀한 "evaluate to type"을 지정합니다(gcc의 경우,FLT_EVAL_METHOD == 2는 32비트 x86 디폴트입니다.FLT_EVAL_METHOD == 0는 64비트 x86-64의 디폴트입니다만,FLT_EVAL_METHOD == 2옵션 -mfpmath=387을 사용하여 x86-64로 지정할 수 있습니다.)C99 이전에는 컴파일러가 특히 x87 부동소수점 하드웨어를 사용하는 경우 중간 결과를 반올림하여 컴파일러 고유의 [10]동작을 일으킬 수 있었습니다.이러한 불일치는 C99(부속서 F)에 준거한 컴파일러에서는 허용되지 않습니다.

연속분율함수를 계산하기 위한 C99 코드 예시는 주요 특징을 보여줍니다.

#실패하다 <stdio.h> #실패하다 <math.h> #실패하다 <backet.h> #실패하다 <펜브.h> #실패하다 <tgmath.h> #실패하다 <stdbool.h> #실패하다 <고객명>님.h>  더블 계산_fn(더블 z)  // [1] {         #프라그마 STDC FENV_ACCESS ON// [2]          주장하다(FLT_EVAL_Method == 2);  // [3]          한다면 (하지 않다(z))  // [4]                 놓다("z는 숫자가 아닙니다.");          한다면 (이인프(z))                 놓다("z는 무한");           더블 r = 7.0 - 3.0/(z - 2.0 - 1.0/(z - 7.0 + 10.0/(z - 2.0 - 2.0/(z - 3.0)))); // [5, 6]          페클렉스(FE_DIVBYZERO);  // [7]          부울 길러진 = 제외(FE_Overflow);  // [8]          한다면 (길러진)                 놓다('예상치 못한 오버플로');          돌아가다 r; }  인트 주된(무효) {         #ifndef __STDC_IEC_559__         놓다("경고: __STDC_IEC_559__는 정의되어 있지 않습니다.IEEE 754 부동소수는 완전히 지원되지 않습니다."); // [9]         #엔디프          #프라그마 STDC FENV_ACCESS ON          #ifdef TEST_NUMERIC_STABLITY_업.         주변(FE_UPWARD);                   // [10]         #elif TEST_NUMERIC_STABLITY_DOWN         주변(FE_DOWNWARD);         #엔디프          인쇄물("%7g\n", 계산_fn(3.0));         인쇄물("%7g\n", 계산_fn(나노));          돌아가다 0; } 

각주:

  1. 컴파일 대상:gcc -std=c99 -mfpmath=387 -o test_c99_fp -lm test_c99_fp.c
  2. IEEE 754 상태 플래그가 이 함수로 조작되기 때문에 이 #pragma는 컴파일러가 최적화할 때 이러한 테스트를 잘못 정렬하지 않도록 하기 위해 필요합니다. (Pragma는 보통 구현 정의되지만 접두사는 다음과 같습니다.STDCC 표준에 정의되어 있습니다.)
  3. C99는 제한된 수의 표현 평가 방법을 정의합니다. 현재의 컴파일 모드를 확인하여 코드가 작성된 가정을 충족하는지 확인할 수 있습니다.
  4. NaN 및 양의 무한대 또는 음의 무한대와 같은 특수 값을 테스트하고 설정할 수 있습니다.
  5. long double는 IEEE 754 더블 익스텐션 또는 쿼드 정밀도(사용 가능한 경우)로 정의됩니다.중간 계산에 필요한 것보다 높은 정밀도를 사용하면 반올림[11] 오류를 최소화할 수 있습니다(typedef). double_t모두 휴대할 수 있는 코드에 사용할 수 있습니다.FLT_EVAL_METHODs)
  6. 평가할 주요 기능.예를 들어 3.0과 같은 이 연속된 분수에 대한 일부 인수가 0에 의한 나눗셈 오류를 야기하는 것처럼 보이지만, 실제로는 함수는 3.0으로 잘 정의되어 있고 0에 의한 나눗셈은 유한한 결과로 이어지는 +infinity를 단순히 반환합니다: IEEE 754는 기본적으로 그러한 예외에 트랩되지 않도록 정의되어 있으며 다음과 같이 설계되어 있습니다.이 경우처럼 y는 무시될 수 있습니다.(만약FLT_EVAL_METHOD2로 정의하면 상수를 포함한 모든 내부 계산이 긴 이중 정밀도로 수행됩니다.FLT_EVAL_METHOD는 0으로 정의되며, 추가 캐스팅과 긴 2배의 상수의 명시적 지정을 포함하여 이를 보장하기 위해 추가 주의가 필요합니다.)
  7. 이 경우 0으로 분할된 플래그는 오류가 아니므로 나중에 사용할 수 있도록 플래그를 클리어하기 위해 간단히 해제할 수 있습니다.
  8. 경우에 따라서는 오버플로 등 다른 예외는 오류로 간주될 수 있습니다(그러나 실제로는 이 경우는 발생할 수 없습니다).
  9. __STDC_IEC_559__는, 컴파일러와 C 라이브러리에 의해서 완전하게 실장되어 있는 경우에만 정의됩니다(이 매크로는 정의되어서는 안 되지만, 정의되어 있는 것에 주의해 주세요).
  10. IEEE 754의 경우 기본 반올림 모드는 가장 가까운 반올림 모드(반올림 규칙 포함)이지만 반올림 모드를 명시적으로 + 및 - 무한대로 설정합니다(정의).TEST_NUMERIC_STABILITY_UP(디버깅 시)를 사용하여 [12]수치불안정성을 진단할 수 있습니다.이 방법은 다음과 같은 경우에도 사용할 수 있습니다.compute_fn()는 개별적으로 컴파일된 바이너리 라이브러리의 일부입니다.그러나 함수에 따라서는 수치적 불안정성이 항상 감지되는 것은 아닙니다.

버전 검출

표준 매크로__STDC_VERSION__가치로 정의되어 있다199901LC99 지원을 사용할 수 있음을 나타냅니다.와 마찬가지로__STDC__매크로(C90용),__STDC_VERSION__C90 컴파일러와 C99 컴파일러에 대해 다른 컴파일러로 컴파일되는 코드를 기술하는 데 사용할 수 있습니다.이 예에서는, 다음과 같이 하고 있습니다.inline어느 경우든 (로 대체함으로써) 사용할 수 있습니다.static링커 오류를 피하기 위해 C90에서).

# __STDC_VERSION__>= 199901인 경우l   /* 키워드 */는 "crypto"입니다. #실패하다 # 인라인 스태틱 정의 #엔디프 

실장

대부분의 C 컴파일러는 C99에서 도입된 기능의 적어도 일부를 지원합니다.

지금까지 Microsoft는 Visual C++ 툴에 새로운 C기능을 실장하는 데 시간이 걸렸고, 대신 C++[13] 표준의 개발을 지원하는 데 주력했습니다.그러나 Visual C++ 2013의 도입으로 Microsoft는 C99의 제한된 서브셋을 구현하였으며, 이는 Visual C++[14] 2015에서 확장되었습니다.

장래의 일

1999년 C 표준이 비준된 이후, 표준 작업 그룹은 임베디드 처리, 추가 문자 데이터 유형(유니코드 지원), 향상된 경계 검사 기능을 명시한 기술 보고서를 작성했습니다.작업은 10진수 부동소수점, 추가 수학적 특수함수추가 동적 메모리 할당 함수를 다루는 기술 보고서에 대해 계속 진행됩니다.C 및 C++ 표준 위원회는 스레드 프로그래밍의 사양에 대해 협력해 왔습니다.

C 표준의 다음 개정판인 C11[41]2011년에 비준되었다.C 표준 위원회는 기존 구현에서 테스트되지 않은 새로운 기능의 채택을 제한하는 지침을 채택했습니다.시퀀스 포인트를 명확히 하고 스레드 프로그래밍을 지원하기 위해 메모리 모델을 개발하는 데 많은 노력이 소요되었습니다.

「 」를 참조해 주세요.

레퍼런스

  1. ^ "ISO/IEC 9899:1999 - Programming languages - C". Iso.org. 8 December 2011. Retrieved 8 April 2014.
  2. ^ a b "IEEE 754 Support in C99" (PDF). grouper.ieee.org. Archived from the original (PDF) on 28 October 2017. Retrieved 15 July 2021.
  3. ^ "Standards - Using the GNU Compiler Collection (GCC)". Gcc.gnu.org. Retrieved 8 April 2014.
  4. ^ "C Dialect Options - Using the GNU Compiler Collection (GCC)". Gcc.gnu.org. 6 May 2009. Retrieved 8 April 2014.
  5. ^ "Using the GNU Compiler Collection (GCC): Designated Initializers". gnu.org. Retrieved 18 September 2019.
  6. ^ "Using the GNU Compiler Collection (GCC): Compound Literals". gnu.org. Retrieved 31 January 2016.
  7. ^ Ulrich Drepper (23 October 2007). "What every programmer should know about memory". LWN.net. Retrieved 3 April 2015.
  8. ^ ISO/IEC 9899:1999 specification, TC3 (PDF). p. 119, § 6.7.5.3 Function declarators (including prototypes) para. 7.
  9. ^ Doug Priest (1997). "Differences Among IEEE 754 Implementations".
  10. ^ Jack Woehr (1 November 1997). "A conversation with William Kahan".
  11. ^ William Kahan (11 June 1996). "The Baleful Effect of Computer Benchmarks upon Applied Mathematics, Physics and Chemistry" (PDF).
  12. ^ William Kahan (11 January 2006). "How Futile are Mindless Assessments of Roundoff in Floating-Point Computation?" (PDF).
  13. ^ Peter Bright (29 June 2013). "C99 acknowledged at last as Microsoft lays out its path to C++14". Ars Technica. Retrieved 9 January 2015.
  14. ^ a b c Brenner, Pat. "What's New for Visual C++ in Visual Studio 2015". Microsoft Developer Network. Retrieved 27 April 2015.
  15. ^ "Using the x86 Open64 Compiler Suite" (PDF). Developer.amd.com. Archived (PDF) from the original on 24 January 2022. Retrieved 2 March 2022.
  16. ^ "cc65 - a freeware C compiler for 6502 based systems". Retrieved 14 September 2011.
  17. ^ "C/C++ interpreter Ch C99 features". SoftIntegration, Inc. 15 February 2008. Retrieved 15 February 2008.
  18. ^ "Clang Compiler User's Manual". Retrieved 14 October 2017.
  19. ^ "The CompCert C verified compiler documentation and user's manual (Version 3.10)". 19 November 2021. Retrieved 3 March 2022.
  20. ^ "libfirm homepage". Retrieved 4 February 2014.
  21. ^ "C Language Implementation - Digital Mars". Retrieved 14 September 2011.
  22. ^ "Status of C99 features in GCC". Free Software Foundation, Inc. 28 July 2021. Retrieved 13 August 2021.
  23. ^ "Status of C99 features in GCC 4.6". Free Software Foundation, Inc. 23 May 2013. Retrieved 23 May 2013.
  24. ^ "Status of C99 features in GCC 4.7". Free Software Foundation, Inc. 23 May 2013. Retrieved 23 May 2013.
  25. ^ "Semantics of Floating Point Math in GCC". 20 July 2018. Retrieved 12 August 2018.
  26. ^ "IBM C for AIX, V6.0 Now Supports the C99 Standard". Retrieved 31 January 2016.
  27. ^ "IBM - XL C/C++ for AIX". Retrieved 31 January 2016.
  28. ^ "IBM Rational Logiscope support for C99 standard - United States". 24 February 2012. Retrieved 31 January 2016.
  29. ^ "Reader Q&A: What about VC++ and C99?". Sutter’s Mill. 3 May 2012. Retrieved 31 January 2016.
  30. ^ "A.27 Use of C99 Variable Length Arrays". Microsoft. Retrieved 31 January 2016.
  31. ^ "Microsoft to C99 Developers: Use ISO C++". InfoQ. Retrieved 31 January 2016.
  32. ^ "C99 library support in Visual Studio 2013". Microsoft. 19 July 2013. Retrieved 31 January 2016.
  33. ^ "C++11/14 STL Features, Fixes, And Breaking Changes In VS 2013". Blogs.msdn.com. 28 June 2013. Retrieved 8 April 2014.
  34. ^ "Announcing full support for a C/C++ conformant preprocessor in MSVC". Microsoft. 27 March 2020. Retrieved 17 September 2020.
  35. ^ "C99 compliance in Open Watcom". Archived from the original on 3 May 2015. Retrieved 25 September 2015.
  36. ^ "Pelles C Overview". January 2013. Archived from the original on 13 March 2022. Retrieved 2 March 2022.
  37. ^ "Sun Studio 12: C Compiler 5.9 Readme". Sun Microsystems, Inc. 31 May 2007. Retrieved 23 September 2012.
  38. ^ "Tiny C Compiler Reference Documentation". Retrieved 31 January 2016.
  39. ^ 프로젝트의 TODO 목록에 따르면 C99 기능이 누락된 것은 복합 유형뿐입니다.가변 길이 어레이는 TCC 0.9.26에 추가되었습니다[ 1 ]
  40. ^ "TCC : Tiny C Compiler". Retrieved 31 January 2016.
  41. ^ "Standards - Using the GNU Compiler Collection (GCC)". Gcc.gnu.org. Retrieved 8 April 2014.

추가 정보

외부 링크

선행 C 언어 표준 에 의해 성공자