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 유형. < 으로 대체될 수 있습니다