your programing

파일 범위에서 다양하게 수정 된 배열

lovepro 2020. 10. 5. 20:31
반응형

파일 범위에서 다양하게 수정 된 배열


내 ".m"파일의 최상위 수준에서 다음과 유사한 Objective-C 구현 파일 전체에서 사용할 상수 정적 배열을 만들고 싶습니다.

static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = { 
  1,
  2, 
  3, 
  4 };

NUM_TYPES나중에 파일에서 사용할 계획 이므로 변수에 넣고 싶었습니다.

그러나 이렇게하면 오류가 발생합니다.

"파일 범위에서 다양하게 수정 된 '유형'"

나는 이것이 배열 크기가 변수 인 것과 관련이있을 수 있다고 수집합니다 (예 : 정수 리터럴을 넣을 때이 메시지를받지 못합니다 static int types[4]).

나는 이것을 고치고 싶지만, 아마 나는 그것에 대해 모두 잘못하고있다 ... 나는 여기에 두 가지 목표가 있습니다.

  1. 파일 전체에서 액세스 할 수있는 배열을 가지려면
  2. 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;

Imho 이것은 많은 c 컴파일러의 결함입니다. 내가 작업 한 컴파일러는 주소에 "정적 const"변수를 저장하지 않지만 코드에서 사용하는 것을 매우 상수로 대체한다는 사실을 알고 있습니다. 이는 전 처리기 #define 지시문을 사용할 때와 정적 const 변수를 사용할 때 생성 된 코드에 대해 동일한 체크섬을 얻으므로 확인할 수 있습니다.

어느 쪽이든 정적 const는 형식에 안전하므로 가능하면 #defines 대신 정적 const 변수를 사용해야합니다.


다른 답변에서 이미 설명했듯이 constC에서는 변수가 읽기 전용임을 의미합니다. 여전히 런타임 값입니다. 그러나 enumC에서는를 실수 상수로 사용할 수 있습니다 .

enum { NUM_TYPES = 4 };
static int types[NUM_TYPES] = { 
  1, 2, 3, 4
};

참고 URL : https://stackoverflow.com/questions/1712592/variably-modified-array-at-file-scope

반응형