2014-09-19 2 views
7
난 그냥 (90분의 89) C에서 C

C++ 배열 크기 선언과 CONST

에서 오는, C++로 점프 해요

가하는 const 실제로하지 않은 #define 반대 ('enum, 일정 D 조, 또는 리터럴)이 아니라 한 번 설정하면 읽기 전용입니다. 즉, 내가 할 수 있습니다

const int x = rand(); 

하고 괜찮아요 - 포인트가 x 런타임 때까지 알 수없는 것. 따라서 나는 할 수 없다.

int arr[x]; // error - x is not a compile-time constant 

그런 다음 C 표준 (99?) 중 하나가 계속되어 가변 길이 배열이 허용된다. C에서 ANSI 표준에 대해 일반적으로 코드를 작성했지만 실제로 C++ 11을 픽업하려고 할 때 실제로 영향을 미쳤습니다.

내가 아는 한, C++은 가변 길이 배열을 허용하지 않습니다. 그러나 많은 컴파일러에서는이를 확장 (GCC?)으로 허용합니다. 문제는 C++ 11을 배우려고 할 때, 코딩하는 코드가 유효한 C++인지 또는 C99 호환으로 확장 된 C++인지 알 수 없기 때문입니다. 예 :

std::default_random_engine e{}; 
std::uniform_int_distribution<int> d{}; 
const int x{d(e)}; 
int arr[x]; // compiles 

유효한 C++인지 여부를 알 수 없습니다. 분명히 x의 값은 런타임까지 알 수 없습니다. C와 C++의 차이를 이해하지 못할 수도 있습니다. const?

+0

유효하지 않습니다. '-std = ...'플래그를 사용하십시오.'... '는 표준입니다. 'C++ 11' 또는'C++ 98'. – juanchopanza

+2

당신은 또한'-pedantic'을 사용할 수도 있습니다 – Jarod42

+0

@juanchopanza 저는'-std = C++ 11'을 사용하여 실제로 컴파일했고 아무런 경고도 내지 않았습니다. Shafik이'-pedantic' 플래그를 사용하면 경고 팝업이 나타납니다! – zac

답변

9

당신은 VLAs are a C99 feature (C11에서 선택 )과 C++ 표준 확장으로 C++에서 그들을 허용 gccclang 모두 있지만이 기능을 포함하지 않습니다 정확합니다. 우리는 그들이 말하는 draft C++11 standard 섹션 8.3.4배열로 이동하여 허용되지 않습니다 볼 수 있습니다 gccclang 모두 들어

D1 [ constant-expressionopt] attribute-specifier-seqopt 
    ^^^^^^^^^^^^^^^^^^^^^^ 

당신이 확장을 사용하는 경우 경고합니다 -pedantic 플래그를 사용하여. C++ 11을 타겟팅하는 경우 -std=c++11을 사용하여 지정해야합니다. -pedantic-errors을 사용하여 경고를 오류로 만들 수 있습니다.

gcc

warning: ISO C++ forbids variable length array 'arr' [-Wvla] 
int arr[x]; // compiles 
     ^
는 다양한 표준, 기본값과 Language Standards Supported by GCC 페이지에 기본으로 적용하는 플래그에 대한 지원을 문서화하고 말한다 : 당신이 -pedantic를 사용하여 코드를 컴파일하는 경우는 다음과 같은 경고가 표시됩니다

표준에 필요한 모든 진단을 얻으려면 도 -pedantic (또는 경고가 아닌 오류가되도록하려면 -pedantic-errors)을 지정해야합니다. 일반적으로 clang에서

gcc이 무엇을 지원하지만 당신은 자신의 Language Compatibility 페이지에 대한 자세한 내용을 확인할 수 있습니다.

GingerPlusPlus에서 언급 한 바와 같이 std:vector은 C++의 VLA에 대한 대안으로 간주됩니다.

+0

놀라운! 그래서이게 * C99 확장자 – zac

+0

(매우 빠른) 응답을 사용하고있는 것 같습니다! – zac

+0

수정 사항을 보내 주셔서 감사합니다. – zac