2011-09-03 4 views
2
#include <stdio.h> 
int const NAMESIZE = 40; 
int const ADDRSIZE = 80; 
typedef char NameType[NAMESIZE]; 
typedef char AddrType[ADDRSIZE]; 

typedef struct 
{ 
    NameType name; 
    AddrType address; 
    double salary; 
    unsigned int id; 
}EmpRecType; 

int main(int * argc, char * argv[]) 
{ 
    EmpRecType employee; 
    return 0; 
} 

const 대신 #define을 사용하면 컴파일됩니다.이 C 코드가 컴파일되지 않는 이유는 누구나 알고 계십니까?

employee.c : 5 : 14 : 오류 : 가변 변성 'NAMETYPE'파일 범위에서 employee.c : 6 : 14 : 오류 : 가변 변성 'AddrType'파일 범위

+1

는 어떤 오류를 주는가? –

+1

[파일 범위의 가변 배열] 가능한 복제본 (http://stackoverflow.com/questions/1712592/variably-modified-array-at-file-scope) –

+2

'const int' 대신' int const'? –

답변

9

하나는 C++에서 const int 객체 즉, 상수이고 그것 상수 식을 형성하는데 이용 될 수 있다는 것이다. C에서, 반면에, const int 객체는 전혀 변하지 않습니다 (더 이상 "변경 불가능한 변수"과 같습니다).

한편 C에서 파일 범위 배열의 배열 크기는 상수 표현이어야하며이 때문에 const int 개체는 해당 역할에서 작동하지 않습니다. 위의 코드는 C++로 완벽하게 컴파일되지만 C로 컴파일되지 않습니다.

C 언어에서는 명명 된 상수를 정의하기 위해 #define 또는 enum을 사용해야합니다. 구체적인 경우 다음과 같이 할 수 있습니다.

#define NAMESIZE 40 
#define ADDRSIZE 80 

P. 파일 범위 배열을 로컬 배열로 대체하면 C 코드 (ANSI C99)가 로컬 범위의 가변 길이 배열 (VLA)을 지원하므로 C 코드는 그대로 배열 크기로 const int 객체로 컴파일됩니다. (그런 경우 배열은 VLA가됩니다). 이전 버전의 C (ANSI C89/90과 같은)에서는 코드가 로컬 배열에서도 컴파일되지 않습니다. 질문에 대한 답변이되었지만

+0

감사합니다.이 설명에 감사드립니다. –

7
이 오류이며

C에서 이러한 const 선언은 단지 일부 읽기 전용 메모리를 정의하며, 이는 참된 상수가 아닙니다. 런타임 시까 지 평가할 수 없으며 배열 선언에 비해 너무 늦습니다. ++ C 및 C 사이의 차이

+0

아아 이제 알겠습니다 ... 감사합니다. –

관련 문제