source

파일 범위에서 가변적으로 변경된 어레이

goodcode 2022. 8. 30. 22:12
반응형

파일 범위에서 가변적으로 변경된 어레이

Objective-C 구현 파일 전체에서 사용되는 고정 정적 어레이를 만들고 싶다.m 파일의 최상위 레벨에 다음과 같은 것이 있습니다.

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변수로 변환하여 파일 내의 다른 장소에 동일한 리터럴이 흩어져 있지 않도록 합니다.

좋은 의견이라도 있나?

[EDIT] C FAQ에 기재되어 있습니다.http://c-faq.com/ansi/constasconst.html

이 경고의 이유는 c의 const가 const를 의미하는 것이 아니기 때문입니다. "읽기 전용"이라는 의미입니다.따라서 값은 메모리 주소에 저장되며 기계 코드에 의해 변경될 수 있습니다.

이미 다른 답변에서 설명했듯이constC는 변수가 읽기 전용임을 의미합니다.이 값은 여전히 런타임 값입니다.단, 이 명령어를 사용하여enumC의 실제 상수로서:

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

다른 답변에 따라 프리프로세서를 사용할 예정이라면 컴파일러가 다음 값을 결정하도록 할 수 있습니다.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;

이것은 많은 c 컴파일러의 결함입니다.저와 함께 작업한 컴파일러는 주소에 "static const" 변수를 저장하지 않고 코드의 사용을 매우 정수로 대체한다는 사실을 알고 있습니다.이것은 preprocessors #define 디렉티브를 사용할 때와 static const 변수를 사용할 때 생성된 코드에 동일한 체크섬을 얻을 수 있기 때문에 확인할 수 있습니다.

어느 쪽이든 static const는 safe 타입이므로 가능한 한 #defines 대신 static const 변수를 사용해야 합니다.

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

반응형