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 중국어 웹사이트의 기타 관련 기사를 참조하세요!