현재 위치 - 중국 분류 정보 발표 플랫폼 - 비즈니스 서비스 정보 - C89 와 c99 의 차이점은 무엇입니까? C89 를 지원하는 컴파일러는 무엇입니까?

C89 와 c99 의 차이점은 무엇입니까? C89 를 지원하는 컴파일러는 무엇입니까?

C99 와 C89 의 차이점:

1, restrict 포인터 추가

C99 에는 포인터에 대한 공개 restrict 유형 수정자가 추가되었습니다. 이는 포인터가 가리키는 객체에 처음 액세스할 수 있는 유일한 방법이므로

Restrict 포인터 표현식을 사용하여 객체에 액세스할 수 있습니다. Restrict 포인터는 주로 함수 인수로 사용되거나 malloc () 함수

를 가리킵니다

숫자에 할당된 메모리 변수입니다. Restrict 데이터 유형은 프로그램의 의미를 변경하지 않습니다.

함수에 두 개의 restrict 포인터 인수가 정의되어 있는 경우 컴파일러는 두 개의 다른 객체인 memcpy()

를 가리킨다고 가정합니다

함수는 restrict 포인터의 일반적인 응용 프로그램 예제입니다. C89 의 memcpy () 함수 프로토타입은 다음과 같습니다.

코드:

Void *memcpy (void *s1, const void *s2, size _ tsize); S1 과 S2 가 가리키는 객체가 겹치는 경우

그 작업은 정의되지 않았습니다. Memcpy () 함수는 겹치지 않는 객체에만 사용할 수 있습니다. C99 의 memcpy () 함수 프로토타입은 다음과 같습니다.

코드:

Void *memcpy(void *restrict S1, const void *restrict S2, size _ tsize); Restrict 사용

S1 및 S2 인수를 재손질하면 해당 프로토타입에서 다른 객체를 가리킬 수 있습니다.

2, 인라인 키워드

인라인 함수는 구조화 및 함수식 정의 방식을 유지하는 것 외에도 프로그래머가 효율적인 코드를 작성할 수 있도록 합니다. 함수의 각 호출과

반환은 상당한 시스템 리소스를 소모합니다. 특히 함수 호출이 반복 횟수가 많은 루프 문에서 발생하는 경우. 일반적으로

를 보낼 때

함수 호출을 생성할 때 인수는 스택에 들어가야 하고 다양한 레지스터 메모리는 저장해야 합니다. 함수가 반환되면 레지스터의 내용을 복원해야 합니다. 이

함수는 코드 내에서 온라인으로 확장되며, 코드가 실행될 때 이러한 저장 및 복구 작업 관광 활동이 다시 발생하고 함수 호출 실행

행속도도 크게 빨라질 것이다. 함수의 온라인 확장은 긴 코드를 생성하므로 응용 프로그램 성능에 상당한 영향을 미치는

인라인만 포함해야 합니다

함수 및 길이가 짧은 함수.

3, 새로운 데이터 유형

_Bool

값은 0 또는 1 입니다. C99 에는 bool, true 및 false 매크로를 정의하는 헤더 폴더 LT 가 추가되었습니다. Stdbool.hgt;; , 프로그램

직원은 C 및 C++ 와 모두 호환되는 응용 프로그램을 작성할 수 있습니다. 새 애플리케이션을 작성할 때는

를 사용해야 합니다

Lt; Stdbool.hgt;; 헤더 파일의 bool 매크로입니다.

_Complex and _Imaginary

C99 표준에 정의된 복수 유형은 float_Complex; 입니다. Float_Imaginary;; Double_Complex;;

Double_Imaginary;; Long double_Complex;; Long double _ imaginary ..

Lt; Complex.hgt;; 헤더 파일에 complex 및 imaginary 매크로가 정의되어 _Complex 및 _Imaginary 로 확장됩니다.

따라서 새 응용 프로그램을 작성할 때는 LT 를 사용해야 합니다. Stdbool.hgt;; 헤더 파일의 complex 및 imaginary 매크로.

Long long int

Long long int(-(2e63-1) 에서 2e63-1) 및 unsigned long long int(0-2e64

가 C99 표준에 도입되었습니다

-1). Long long int 가 지원할 수 있는 정수 길이는 64 비트입니다.

4, 배열 향상

가변 길이 배열

C99 에서 프로그래머가 배열을 선언할 때 배열의 차원은 런타임에만 결정할 수 있는

를 포함하여 모든 유효한 정수 표현식에 의해 결정될 수 있습니다

값의 표현식. 이를 가변 길이 배열이라고 하지만 로컬 배열만 길어질 수 있습니다.

가변 길이 배열의 치수는 배열 수명 동안 변하지 않습니다. 즉, 가변 길이 배열은 동적이지 않습니다. 변경할 수 있는 것은 배열의 크기뿐입니다.

* 를 사용하여 불확실한 길이의 가변 길이 배열을 정의할 수 있습니다.

배열 선언의 유형 수정자

C99 에서 배열을 함수 인수로 사용해야 하는 경우 배열 선언의 대괄호 안에

와 같은 static 키워드를 사용할 수 있습니다

컴파일러에게 인수를 가리키는 배열에는 최소한 지정된 요소 수가 포함되어야 한다고 알려 줍니다. 배열 선언의 대괄호 안에

를 사용할 수도 있습니다

Restrict, volatile, const 키워드이지만 함수 인수에만 사용됩니다. Restrict 를 사용하는 경우 포인터가 객체에 처음 액세스할 수 있는 유일한 방법입니다

지름. Const 를 사용하는 경우 포인터는 항상 동일한 배열을 가리킵니다. Volatile 을 사용하는 것은 의미가 없습니다.

5, 한 줄 주석

C++ 처럼 사용할 수 있는 단일 행 주석 태그 "//"가 도입되었습니다.

6, 분산 코드 및 선언

7, 전처리 기 수정

A, 인수 목록

매크로는 인수를 가질 수 있으며 매크로 정의에서 줄임표 (...) 로 표시됩니다. 내부 전처리 식별자 __VA_ARGS__ 인수를 결정할 위치

장소를 교체하다. 예: # define mysum (...) sum (_ _ va _ args _ _) 문 MySum(k, m, n);

합계 (k, m, n) 로 변환됩니다. 인수에는 인수를 포함할 수도 있습니다.

예: #define compare(compf, ...)

Compf (_ _ va _ args _) 여기서 compare(strcmp, "small", "large"); 다음으로 대체:

Strcmp("small ","large ");

B, _Pragma 연산자

C99 는 프로그램에서 컴파일 명령을 정의하는 또 다른 방법인 _Pragma 연산자를 도입했습니다. 형식은 다음과 같습니다.

_Pragma("directive")

여기서 directive 는 전체 계산을 위한 컴파일 명령입니다. _Pragma 연산자를 사용하면 컴파일 지시문이 매크로 대체에 참여할 수 있습니다.

C, 내부 컴파일 명령

STDCFP_CONTRACT ON/OFF/DEFAULT ON 인 경우 부동 소수점 표현식은 하드웨어 기반 독립형

으로 처리됩니다

단위. 기본값은 정의된 도구입니다.

STDCFEVN_ACCESS ON/OFF/DEFAULT 는 컴파일러에게 부동 소수점 환경에 액세스할 수 있음을 알려줍니다. 기본값은 정의된 도구입니다.

Stdc CX _ limited _ range ON/off/default 값이 on 인 경우 컴파일러에게 특정 프로세스에

가 포함되어 있음을 알리는 것과 같습니다

복수형이 있는 공식은 믿을 만하다. 기본값은 OFF 입니다.

D, 새로운 내부 매크로

__STDC_HOSTED__ 운영 체제가 있는 경우 1

__STDC_VERSION__ 199991L 이상. C 를 나타내는 버전

__STDC_IEC_599__ IEC 60559 부동 소수점 연산이 지원되는 경우 1

__STDC_IEC_599_COMPLEX__ IEC 60599 복수가 지원되는 경우 1

__STDC_ISO_10646__ ISO/IEC 10646 표준의 연도 및 월 형식을 설명하는 컴파일러 지원:

Yyymml

8, for 문 내의 변수 선언

C99 에서 프로그래머는 for 문의 초기화 섹션에 하나 이상의 변수를 정의할 수 있습니다. 이러한 변수의 범위는 본 for 어에만

적용됩니다

문장이 통제하는 순환 체내. 예:

코드:

For (int I = 0; Ilt;; 10; I++){

// do someting ...

}

9, 복합 할당

C99 에서 복합 할당에서 객체 유형의 배열, 구조 또는 결합 표현식을 지정할 수 있습니다. 복합 할당을 사용할 때는 괄호

를 사용해야 합니다

내에서 유형을 지정한 다음 중괄호로 둘러싸인 초기화 목록을 차례로 지정합니다. 유형이 배열인 경우 배열 크기를 지정할 수 없습니다. 완성된 대상은

입니다

이름이 지정되지 않았습니다.

예: double * FP = (double []) {1.1,2.2,3.3};

이 문은 double 에 대한 포인터 FP 를 설정하고 이 3 요소 배열의 첫 번째 요소를 가리키는 데 사용됩니다. 파일

도메인 내에 설정된 복합 할당은 프로그램의 전체 수명 동안에만 유효합니다.

모듈 내에 설정된 복합 할당은 로컬 객체이며 모듈을 종료한 후

더 이상 존재하지 않습니다.

10, 유연한 배열 구조 멤버

C99 에서 구조의 마지막 요소는 알 수 없는 크기의 배열을 허용합니다. 이를 유연한 배열 멤버라고 하지만 구조의 유연성 수

그룹 구성원 앞에는 하나 이상의 다른 구성원이 있어야 합니다. 유연한 배열 멤버를 사용하면 구조에 가변 크기의 배열을 포함할 수 있습니다. Sizeof 가 반환한 이

시드 구조 크기에는 유연한 배열의 메모리가 포함되지 않습니다. 유연한 배열 멤버를 포함하는 구조는 malloc () 함수를 사용하여 메모리를 동적으로 할당하고

할당된 메모리는 유연한 배열의 예상 크기를 수용할 수 있도록 구조의 크기보다 커야 합니다.

11, 지정된 초기화 문자

C99 에서 이 특성은 스파스 배열을 자주 사용하는 프로그래머에게 유용합니다. 지정된 초기화 문자는 일반적으로 배열에 사용,

의 두 가지 용도로 사용됩니다

그리고 구조와 연합에 사용됩니다. 배열에 사용되는 형식: [index] = vol; 여기서 index 는 배열의 아래 첨자를 나타내고 vol 은 배열

을 나타냅니다

요소의 초기화 값입니다.

예: int x[10] = {[0] = 10, [5] = 30}; 여기서 x[0] 과 x[5] 만 초기화되었습니다. 구조나 연결

에 사용됩니다

합친 형식은 다음과 같습니다.

Member-name (멤버 이름)

구조에 지정된 초기화를 수행할 때 간단한 방법으로 구조에서 지정된 멤버를 초기화할 수 있습니다.

예: struct example{ int k, m, n; } object = {m = 10, n = 200};

여기서 k 는 초기화되지 않았습니다. 구성요소가 초기화되는 순서에는 제한이 없습니다.

12, printf () 및 scanf () 함수 시리즈의 향상된 기능

C99 의 printf () 및 scanf () 함수 시리즈에는 long long int 및 unsigned long long int 데이터 유형 처리

가 도입되었습니다

을 눌러 섹션을 인쇄할 수도 있습니다. Long long int 유형의 형식 수정자는 ll 입니다. Printf () 및 scanf () 함수에서 ll 은 d, I, o, u 및 x

에 적용됩니다

형식 지정자. 또한 C99 는 hh 수정자를 도입했습니다. Hh 는 d, I, o, u 및 x 형식 지정자를 사용할 때 char

를 지정하는 데 사용됩니다

형 인수. Ll 및 hh 수정자는 모두 n 지정자에 사용할 수 있습니다.

Printf () 함수에서 형식 수정자 a 와 a 를 사용하면 결과는 16 진수 부동 소수점 숫자를 출력합니다. 형식은 [-]0xh, hhhhp

입니다

+d a 형식 수정자를 사용하는 경우 x 와 p 는 대문자여야 합니다. A 및 a 형식 수정자를 scanf () 함수에서도 사용하여

를 읽을 수 있습니다

부동 소수점 숫자. Printf () 함수를 호출할 때 f 지정자 앞에 l 수정자, 즉 lf 를 추가할 수 있지만 작동하지 않습니다.

13, C99 새로운 라이브러리

C89 의 표준 헤더 파일

Lt; Assert.hgt;; 매크로 정의 assert()

Lt; Ctype.hgt;; 문자 처리

Lt; Errno.hgt;; 오류 보고

Lt; Float.hgt;; 구현과 관련된 부동 소수점 근무 정의

Lt; Limits.hgt;; 구현과 관련된 다양한 한도 정의

Lt; Locale.hgt;; Setlocale()

함수를 지원합니다

Lt; Math.hgt;; 수학 라이브러리에서 사용하는 다양한 정의

Lt; Setjmp.hgt;; 부분 점프가 아닌 점프 지원

Lt; Signal.hgt;; 신호 값 정의

Lt; Stdarg.hgt;; 가변 길이를 지원하는 인수 목록

Lt; Stddef.hgt;; 공통 상수 정의

Lt; Stdio.hgt;; 지원 파일 가져오기 및 내보내기

Lt; Stdlib.hgt;; 기타 각종 선언

Lt; String.hgt;; 문자열 함수 지원

Lt; Time.hgt;; 시스템 시간 함수 지원

C99 에 새로 추가된 헤더 파일 및 라이브러리

Lt; Complex.hgt;; 복수 알고리즘 지원

Lt; Fenv.hgt;; 부동 상태 표시 및 부동 환경 기타 측면에 대한 액세스 제공

Lt; Inttypes.hgt;; 표준 이식가능 정수 유형 세트를 정의합니다. 최대 너비 정수를 처리하는 함수도 지원됩니다

Lt; Iso646.hgt;; 먼저 이 1995 년 첫 번째 개정 때 도입된 다양한 연산자에 해당하는 매크로 정의

Lt; Stdbool.hgt;; 부울 데이터 유형 유형이 지원됩니다. C++

와 호환되도록 매크로 bool 정의

Lt; Stdint.hgt;; 표준 이식가능 정수 유형 세트를 정의합니다. 이 파일은 lt 에 포함되어 있습니다. Inttypes.hgt;; 중간

Lt; Tgmath.hgt;; 일반 유형의 부동 매크로 정의

Lt; Wchar.hgt;; 먼저 1995 년 1 차 개정 때 도입된 멀티바이트 및 와이드 바이트 함수 지원

Lt; Wctype.hgt;; 먼저 1995 년 1 차 개정 때 도입된 멀티바이트 및 와이드 바이트 분류 함수 지원

14, __func__ 미리 정의된 식별자

__func__ 에 저장된 함수 이름을 나타내는 데 사용되며 문자열 할당과 유사합니다.

15, 기타 기능 변경

완화된 전환 제한

C89 표준 C99 표준 제한

데이터 블록 중첩 레벨 15 127

조건문의 중첩 레벨 8 63

내부 식별자의 유효한 문자 수 31 63

외부 식별자의 유효한 문자 수 6 31

구조 또는 연합에 있는 멤버 수 127 1023

함수 호출의 매개 변수 수 31 127

암시적 int 규칙

은 더 이상 지원되지 않습니다

암시적 함수 선언

이 (가) 삭제되었습니다

반환 값에 대한 제약 조건

C99 에서 not null 유형 함수는 반환 값이 있는 return 문을 사용해야 합니다.

확장된 정수 유형

확장 유형 의미

Int16_t 정수 길이는 정확한 16 비트

입니다

Int_least16_t 정수 길이는 최소 16 자리

입니다

Int_fast32_t 최소 32 비트 길이의 가장 견고한 정수 유형

Intmax_t 최대 정수 유형

Uintmax_t 최대 부호 없는 정수 유형

정수 유형 이관 규칙 개선

C89 에서는 표현식에서 char 유형, short int 또는 int 유형 값을 int 또는 unsigned int 유형.

으로 올릴 수 있습니다

C99 에서는 각 정수 유형에 레벨이 있습니다. 예를 들어 long long int 는 int 보다 순위가 높고 int 는 char 보다 순위가 높습니다. 표현식에서 int 또는 unsigned int 보다 레벨이 낮은 정수 유형은 int 또는 unsigned int 유형. < 으로 대체될 수 있습니다