내 “.m”파일의 최상위 수준에서 다음과 유사한 Objective-C 구현 파일 전체에서 사용할 상수 정적 배열을 만들고 싶습니다.
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
NUM_TYPES
나중에 파일에서 사용할 계획 이므로 변수에 넣고 싶었습니다.
그러나 이렇게하면 오류가 발생합니다.
“파일 범위에서 다양하게 수정 된 ‘유형'”
나는 이것이 배열 크기가 변수 인 것과 관련이있을 수 있다고 수집합니다 (예 : 정수 리터럴을 넣을 때이 메시지를받지 못합니다 static int types[4]
).
나는 이것을 고치고 싶지만, 아마 나는 그것에 대해 모두 잘못하고있을 것입니다 … 여기에 두 가지 목표가 있습니다.
- 파일 전체에서 액세스 할 수있는 배열을 가지려면
NUM_TYPES
변수로 캡슐화 하여 파일의 다른 위치에 동일한 리터럴이 흩어져 있지 않도록
어떤 제안?
[편집] C FAQ에서 발견 : http://c-faq.com/ansi/constasconst.html
답변
이 경고의 이유 는 c의 const가 상수를 의미하지 않기 때문입니다. “읽기 전용”을 의미합니다. 따라서 값은 메모리 주소에 저장되며 잠재적으로 기계 코드에 의해 변경 될 수 있습니다.
답변
어쨌든 다른 답변에 따라 전처리기를 사용하려는 경우 컴파일러가 NUM_TYPES
자동으로 값을 결정하도록 할 수 있습니다 .
#define NUM_TYPES (sizeof types / sizeof types[0])
static int types[] = {
1,
2,
3,
4 };
답변
#define NUM_TYPES 4
답변
열거를 사용할 수도 있습니다.
typedef enum {
typeNo1 = 1,
typeNo2,
typeNo3,
typeNo4,
NumOfTypes = typeNo4
} TypeOfSomething;
답변
다른 답변에서 이미 설명했듯이 const
C에서는 변수가 읽기 전용임을 의미합니다. 여전히 런타임 값입니다. 그러나 enum
C에서는를 실수 상수로 사용할 수 있습니다 .
enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = {
1, 2, 3, 4
};
답변
Imho 이것은 많은 c 컴파일러의 결함입니다. 내가 작업 한 컴파일러는 주소에 “정적 const”변수를 저장하지 않고 코드에서 사용하는 것을 매우 상수로 대체한다는 사실을 알고 있습니다. 전 처리기 #define 지시문을 사용할 때와 정적 const 변수를 사용할 때 생성 된 코드에 대해 동일한 체크섬을 얻게되므로 확인할 수 있습니다.
어느 쪽이든 정적 const는 유형에 안전하므로 가능하면 #defines 대신 정적 const 변수를 사용해야합니다.