Programing

컴파일러 오류 : "초기화 요소가 컴파일 시간 상수가 아닙니다."

lottogame 2020. 10. 24. 09:26
반응형

컴파일러 오류 : "초기화 요소가 컴파일 시간 상수가 아닙니다."


이 코드를 컴파일 할 때 "초기화 요소가 컴파일 시간 상수가 아닙니다"라는 오류가 발생합니다. 아무도 이유를 설명 할 수 있습니까?

#import "PreferencesController.h"

@implementation PreferencesController

- (id)init
{
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}


NSImage* imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];//error here

함수 범위 밖에서 변수를 정의하면 해당 변수의 값이 실제로 실행 파일에 기록됩니다. 즉, 상수 값만 사용할 수 있습니다. 컴파일 타임에 런타임 환경에 대한 모든 것을 알지 못하기 때문에 (사용 가능한 클래스, 구조 등) 런타임까지 객관적인 c 객체를 만들 수 없습니다. 그 구조를 유지하고 있습니다. 해야 할 일은 변수를 nil로 초기화하고 +initialize이미지를 만드는 데 사용 하는 것입니다. initialize클래스에서 다른 메서드가 호출되기 전에 호출되는 클래스 메서드입니다.

예:

NSImage *imageSegment = nil;
+ (void)initialize {
    if(!imageSegment)
        imageSegment = [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];
}
- (id)init {
    self = [super init];
    if (self) {
        // Initialization code here.
    }

    return self;
}

전역 변수는 4또는 0.0또는 @"constant string"또는 같은 상수 값으로 초기화되어야합니다 nil. 와 같은 객체 생성자 init는 상수 값을 반환하지 않습니다.

전역 변수를 가지려면 초기화 nil한 다음 클래스 메서드를 사용하여 반환해야합니다.

NSImage *segment = nil;

+ (NSImage *)imageSegment
{
    if (segment == nil) segment = [[NSImage alloc] initWithContentsOfFile:@"/user/asd.jpg"];
    return segment;
}

컴파일러에게 본질적으로 동적 인 코드로 정적 변수를 초기화하도록 요청하기 때문입니다.


그 이유는 imageSegment소스 코드 (정적 변수)에서 함수 외부를 정의하기 때문입니다 .

이러한 경우 초기화에는 함수 호출이나 클래스 할당과 같은 코드 실행이 포함될 수 없습니다. 이니셜 라이저는 컴파일 타임에 값이 알려진 상수 여야합니다.

그런 다음 init메서드 내에서 정적 변수를 초기화 할 수 있습니다 (선언을 init로 연기 한 경우).


아래에 표시된대로 확실히 매크로를 #define 할 수 있습니다. 컴파일러는 컴파일 전에 "IMAGE_SEGMENT"를 해당 값으로 바꿉니다. 배열에 대한 전역 조회를 정의 할 수 있지만 전역 변수와 동일하지는 않습니다. 매크로가 확장되면 인라인 코드처럼 작동하므로 매번 새 이미지가 생성됩니다. 따라서 매크로를 사용하는 위치에주의를 기울이면 전역 변수를 효과적으로 만들 수 있습니다.

#define IMAGE_SEGMENT [[NSImage alloc] initWithContentsOfFile:@"/User/asd.jpg"];

그런 다음 아래와 같이 필요한 곳에 사용하십시오. 아래 코드가 실행될 때마다 새 메모리 포인터로 새 객체가 생성됩니다.

imageSegment = IMAGE_SEGMENT

참고URL : https://stackoverflow.com/questions/6143107/compiler-error-initializer-element-is-not-a-compile-time-constant

반응형