2011-11-03 2 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

나에게 오류를 제공합니다 :배열 크기 선언 C에 대한 차이와 C++

error: variably modified ‘X1’ at file scope

동일은 'X2'에 대한 사실이었다.

하지만 위의 코드는 C++의 경우 좋지만 위의 코드는 괜찮습니다 (C++로 착각 할 수도 있음).

아무도 나를 위해 이것을 명확히 할 수 있습니까?

답변

3

예, 차이가 있습니다. C에서 const 변수는 여전히 실제 컴파일 타임 상수로 취급되지 않습니다 (공식적으로 constant expression의 일부로 허용되지 않음). 따라서 허용되지 않습니다. 그러나 C가 컴파일러를 허용 할 필요는 없지만, 표준은 구현이 다른 형태의 상수 표현식을 허용 할 수 있도록 허용하므로 선택할 경우 수락 할 수 있습니다.

C++의 경우 const 변수는 상수로 처리되므로 허용됩니다.

void f(int size) { 
    int array[size]; 
} 

C에서 허용 ++이 아닌 C에서 : 당신은 함수의 매개 변수로 전달 된 값을 사용하는 경우

흥미롭게도, 거의 반대의 사실이다. 이것은 variably modified 배열입니다. 오류 메시지는 기본적으로 이러한 함수가 내부에서만 허용된다는 것을 알려주려고합니다.

+0

C에서는 배열의 크기를 함수에 전달할 수 있습니까? 배웠다! 감사! – Rich

+0

@ 리치 : 예,하지만 컴파일러가 C99와 호환되는 경우 (최소한이 점에서) - 이것은 C89/90에 포함되지 않았습니다 (이전 컴파일러에서도 상당히 일반적인 확장 이었지만). –

0

구조체에 없습니다. 로컬 범위에서 할 수 있습니다.

+0

심지어 C? 다른 대답에 따르면 C++에서는 OK가 아닐 수도 있습니다. – Rich

+3

C99에만, C89에는 없습니다. –

+0

저는 정확한 기준을 기억하지 못하기 때문에 Adam을 신뢰합니다. 그의 버전은 그럴듯하게 들린다. –

0

상수 값을 사용해야합니다. 따라서 C에서는 #define을 사용해야합니다. C++의 경우 좋았을 것입니다.

사용이 대신 : C++에서

#define num 16 
struct inputs{ 
    double X1[num]; 
    double X2[num]; 
}; 
+0

err .. 범위에'# define'이 있습니까? –

+0

나쁜 선택 단어, 의미합니다. –

+0

그게 더 좋습니다 :) –

0

, 시간 상수를 컴파일이 배열 선언에서 길이와 const 변수로 사용할 수 있습니다 (단지 그들 중 일부는) 컴파일 시간 상수가 될 수 있습니다. 이것이 C++에서 작동하는 이유입니다.

C 그러나 가변 길이 배열과 비슷한 기능이 있습니다. 즉, 로컬 변수에 대해서만 배열 길이로 정수 계산식 (런타임 계산식)을 사용할 수 있음을 의미합니다. 이것은 컴파일러가 "가변적으로 수정 된 'X1'의 파일 범위"에 대해 불평하는 이유입니다.

0

이미 다른 사람들에 의해 C와 C++는 상수 표현에 대해 서로 다른 것으로 나타났습니다.

그러나 둘 다 작동하는 코드를 제안한 다른 매크로는 사용할 필요가 없습니다. "범위"로 처리하려면 열거 상수를 사용하면됩니다.이 파일이나 기능 범위에 넣어도 상관없이

enum { num = 16 }; 
struct inputs { 
    double X1[num]; 
    double X2[num]; 
}; 

두 가지 모두 사용할 수 있습니다.