>백엔드 개발 >C++ >'int size = 10;'은 C의 상수 표현식인가요? 컴파일러 호환성 문제인가요?

'int size = 10;'은 C의 상수 표현식인가요? 컴파일러 호환성 문제인가요?

Patricia Arquette
Patricia Arquette원래의
2024-12-09 22:08:15874검색

Is `int size = 10;` a Constant Expression in C  : A Compiler Compatibility Issue?

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

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