2014-01-10 2 views
1
static const int LOG_MAX = 31; 
static int log_table[LOG_MAX]; 

내가 오류 얻을 컴파일 할 때이 코드는 C에서 함수의 내부 : LOG_MAXconst 때문에정적 배열

"main.c:19:16: error: storage size of 'log_table' isn't constant".

나는이 이해가 안 돼요을 .

그냥 C 코드를 명확히하기 위해 GCC를 사용하고 있습니다.

+0

대신 #define을 사용 하시겠습니까? –

+4

어떤 프로그래밍 언어에 대해 궁금하십니까? C와 C++는 서로 다른 언어이며,이 경우 사용되는 프로그래밍 언어 표준 버전에 따라 다른 대답을 얻을 수 있습니다. – Lundin

+0

문제는 정적 const의 선언입니다, 나는 울부 짖었다 대답 –

답변

3

을, 배열

여기에 상수를 가지고있는 두 가지 방법 배열의 경계는 컴파일시에 평가되는 상수 인 문자 여야합니다. const 변수는 컴파일 타임에 평가할 필요가 없으며 런타임에 로컬 변수로 만들 수 있습니다. 또한 다른 대답에서 지적한대로 const은 실제로는 다른 어떤 것보다 읽기 전용으로 간주되어야합니다.

모든 C 및 C++ 표준에서 static 배열은 항상 상수 리터럴을 사용하여 크기를 설정해야합니다. 당신이 static 키워드를 생략하는 경우 새로운 C 표준 (C99, C11)에서

(또는 까다로운 것으로,이 정적 저장 기간있는 모든 변수에 적용)은 그러나 당신이 게시 코드는 완벽하게 괜찮습니다. 그런 다음 가변 길이 배열 (VLA)을 만들 것입니다. VLA는 사용자가 원하는 것일 수도 그렇지 않을 수도 있습니다.

저는 최신 C++ 11 표준에 대해 확신하지 않지만, 필자가 알고있는 한 VLA를 지원하지 않습니다.

1

int이 정적이고 정적인데도 이것은 유효하지 않습니다. 나는 C에서 일정한 의미하지 아니라 읽기 전용 않습니다

#define LOG_MAX 31 
static int log_table[LOG_MAX]; 
+0

정적 저장 기간이있는 @svk 가변 길이 배열은 c99에서 지원되지 않습니다. – ouah

+0

@svk 정적 배열의 경우가 아니기 때문에 C99에서도 유효하지 않습니다. – dasblinkenlight

+0

오, 내 실수는 '정적'을 알아 채지 못했습니다. – svk

2

const 같은 일을 추천 할 것입니다. LOG_MAX은 프로그램에서 상수가 아닙니다.

#define LOG_MAX 31 

또는

enum { 
    LOG_MAX = 31 
}; 
당신은 전처리 사용해야
0

: 오래된 C 및 C++ 표준에서

#define LOG_MAX 31 
static int log_table[LOG_MAX]; 
1

const int 변수가 C.

에서 그러나 배열은 정적 될 것입니다 때문에 것은, 당신이 "전체"선언 즉, 항상 사용할 수 있음을 확신 할 수 컴파일 시간 상수로 간주되지 않기 때문에 이것은 실패 그것은 포인터를 통해 절대 참조 될 수 없습니다.

const size_t log_max = sizeof log_table/sizeof *log_table; 

이 주위에 "마법 상수를"유지 : 동일한 기능의 다른 곳에서 다음

static int log_table[32]; 

과 : 당신이 LOG_MAX을 사용하고 싶었 경우 따라서, 당신은 크기를 인라인 모든 장소에서 sizeof을 사용할 수 있습니다 , 한 곳에서만 가능하며 그 목적은 log_table이 사용되는 방식을 고려할 때 분명해야합니다. 이것은 모두 하나의 함수 안에 있으며 결국 무서운 전역 데이터가 아닙니다.