파일 범위에서 가변적으로 변경된 어레이
Objective-C 구현 파일 전체에서 사용되는 고정 정적 어레이를 만들고 싶다.m 파일의 최상위 레벨에 다음과 같은 것이 있습니다.
static const int NUM_TYPES = 4;
static int types[NUM_TYPES] = {
1,
2,
3,
4 };
사용할 예정입니다.NUM_TYPES
나중에 파일에 저장되기 때문에 변수에 넣으려고 했습니다.
하지만 이렇게 하면 오류가 발생합니다.
"파일 범위에서 가변적으로 수정된 '타입'"
이는 어레이 크기가 변수가 되는 것과 관련이 있을 수 있습니다(정수 리터럴을 입력해도 이 메시지는 표시되지 않습니다).static int types[4]
).
내가 이걸 고치고 싶지만, 내가 모든 걸 잘못하고 있는 것 같아.여기에는 두 가지 목표가 있습니다.
- 파일 전체에서 액세스할 수 있는 배열을 가지려면
- 캡슐화하다
NUM_TYPES
변수로 변환하여 파일 내의 다른 장소에 동일한 리터럴이 흩어져 있지 않도록 합니다.
좋은 의견이라도 있나?
[EDIT] C FAQ에 기재되어 있습니다.http://c-faq.com/ansi/constasconst.html
이 경고의 이유는 c의 const가 const를 의미하는 것이 아니기 때문입니다. "읽기 전용"이라는 의미입니다.따라서 값은 메모리 주소에 저장되며 기계 코드에 의해 변경될 수 있습니다.
이미 다른 답변에서 설명했듯이const
C는 변수가 읽기 전용임을 의미합니다.이 값은 여전히 런타임 값입니다.단, 이 명령어를 사용하여enum
C의 실제 상수로서:
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
'source' 카테고리의 다른 글
C 구조의 멤버로서의 함수 포인터 (0) | 2022.08.30 |
---|---|
Vue.js에서 v-for를 사용하여 개체의 어레이에 있는 항목에 액세스합니다. (0) | 2022.08.30 |
Vuex Store에서 'this'로 액세스 상태 (0) | 2022.08.30 |
Vuex - mapState 데이터로 작업하기 전에 API 호출과 초기 저장소를 기다립니다. (0) | 2022.08.30 |
C/C++의 정수 분할의 빠른 상한 (0) | 2022.08.30 |