>백엔드 개발 >C++ >일부 C 코드가 C에서 컴파일되지 않는 이유는 무엇입니까?

일부 C 코드가 C에서 컴파일되지 않는 이유는 무엇입니까?

DDD
DDD원래의
2024-12-18 10:16:10406검색

Why Does Some C Code Fail to Compile in C  ?

C의 하위 집합: 예외 설명

C가 C의 하위 집합이라고 자주 언급되지만, 다음과 같은 경우가 있습니다. 코드가 C에서는 원활하게 컴파일될 수 있지만 C에서는 실패할 수 있습니다.

사례 C에서 코드가 실패하는 경우

  • 임시 정의:
    C에서는 동일한 변수 이름에 대한 여러 선언을 허용하지만 C에서는 " 오류로 인해 이를 금지합니다. n 이미 정의되었습니다."

    int n;
    int n; // error: redeclaration of 'n'
  • 호환되지 않는 배열 유형:
    C에서는 배열을 다른 유형의 포인터에 할당할 수 있습니다(예: int[1]에서 int * ()), C에서는 그러한 것을 허용하지 않습니다. 변환.

    int a[1];
    int (*ap)[] = &a; // error: 'a' does not have type 'int[]'
  • K&R 함수 정의 스타일:
    C에서는 int b(a) int a; 구문을 사용하여 함수 정의를 허용합니다. { }, 그러나 C는 이를 문법 오류로 간주합니다.

    int b(a) int a; { } // error: grammar error
  • 중첩 구조체 범위:
    C에서는 클래스 범위를 사용하여 중첩 구조체를 선언할 수 있지만 C는 이를 지역 변수로 취급합니다. 대신.

    struct A { struct B { int a; } b; int c; };
    struct B b; // error: 'b' has incomplete type
  • 기본 선언:
    C에서는 유형(예: auto a;)을 지정하지 않고 변수를 선언할 수 있지만 C에서는 명시적인 선언이 필요합니다. 유형 지정자.

    auto a; // error: type-specifier missing

C99의 추가 예외

  • 매개변수의 배열 차원:
    C99는 배열 차원에서 static과 같은 지정자를 금지합니다.

    void f(int p[static 100]) { } // error: invalid syntax
  • 가변 길이 배열:
    C99는 배열 크기가 계산되는 VLA(가변 길이 배열)를 지원하지 않습니다. 런타임.

    int n = 1;
    int an[n]; // error: 'n' is not a constant expression
  • 유연한 배열 멤버:
    C99에는 가변 크기 데이터 멤버를 가질 수 있는 FAM(유연한 배열 멤버)이 부족합니다. structs.

    struct A { int a; int fam[]; }; 
    // error: 'fam' has incomplete type
  • 제한 한정자:
    C99에서는 제한 한정자가 C가 지원하지 않는 메모리의 비앨리어싱을 지정할 수 있도록 허용합니다.

    void copy(int *restrict src, int *restrict dst); // error: two names for one parameter

위 내용은 일부 C 코드가 C에서 컴파일되지 않는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.