"int 크기 = 10;"입니다. 상수 표현식을 생성하시겠습니까?
아래 코드 조각은 gcc 4.8 및 Clang 3.2에서 성공적으로 컴파일됩니다.
int main() { int size = 10; int arr[size]; }
C 표준(8.3.4/1)에 따르면 배열의 크기는 정수 상수 표현식이어야 합니다. 그러나 코드의 "크기"는 정수 상수 표현이 아닌 것으로 보입니다. 이것은 컴파일러 버그입니까, 아니면 우리가 이해한 실수입니까?
Visual Studio C는 "오류 C2466: 상수 크기 0의 배열을 할당할 수 없습니다."라는 메시지와 함께 이 코드를 거부합니다. 이는 컴파일러가 "크기"를 0으로 간주함을 의미합니다.
설명
gcc 및 Clang은 가변 길이 배열(VLA)을 지원합니다. C의 확장. VLA는 런타임에 배열 크기를 결정할 수 있는 C99 기능입니다. 코드 조각에서 "크기"는 컴파일 타임에 결정되지만 리터럴 상수는 아닙니다. 따라서 gcc 및 Clang에서는 "크기"가 VLA로 간주됩니다.
반면 Visual Studio는 VLA를 지원하지 않으며 C 표준을 준수합니다. 결과적으로 "size"는 리터럴 상수가 아니기 때문에 코드를 거부합니다.
표준 준수
C 표준은 정수 상수 표현식 평가 시 정수 계열 또는 범위가 지정되지 않은 열거 유형의 값이 생성되는 표현식입니다. 이 경우 "size"는 리터럴 값(10)으로 초기화되어 정수 상수 표현식이 됩니다.
gcc 및 Clang에서 "-pedantic" 플래그를 사용하면 가변 길이 배열에 대한 경고가 생성됩니다. 코드 조각에서. "-pedantic-errors"를 사용하면 경고가 오류가 됩니다.해결책
C 표준을 준수하려면 "size"를 const 또는 constexpr 정수:const int size = 10;또는
위 내용은 'int size = 10;'은 C의 상수 표현식인가요? 컴파일러 호환성 문제인가요?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!