2012-08-24 1 views
1

나는 수백 개의 상수를 정의하는 .h 파일을 가지고 있습니다. 의 그들 중 하나가이 가정 해 봅시다 :이름이 들어있는 문자열을 사용하여 상수에 액세스하는 방법

#define KDSomeItem  1 

내가 목표 - C 런타임 API 인스턴스 변수 이름의 목록을 검색하는 데 사용할 수 있다는 사실을 알고 :이 질문에 자세히 같은 : How do I list all fields of an object in Objective-C? 가 나는 또한 알고를 getter [object valueForKey:theName]은 이전 질문에서와 같이 ivars에 액세스하는 데 사용할 수 있습니다. How to access a property/variable using a String holding its name

내 질문에 뭔가 상상할 수 있습니까?

A) 나는 문자열 잡고 그 이름이있는 경우 프로그램

B)가 일정에 액세스하는 모든 상수의 목록을

예 : 그건 할 수있는 I이다 이 문자열을 사용하면 NSString * theName = @"KDSomeItem"; 문자열을 사용하여 상수를 평가할 수 있습니까?

답변

1

당신은 이것을 할 수 없습니다 : 인스턴스 변수와 달리 #define -d 상수는 전처리 기가 수행 된 후에 추적을 남기지 않습니다. 메타 데이터를 남기지 않습니다. Objective C 컴파일러가 코드를 분석하기 전에도 프로그램 본문에있는 KDSomeItem의 모든 인스턴스가 1으로 바뀝니다.

런타임에 상수 이름을 사용할 수 있도록하려면 필요한 모든 메타 데이터를 직접 만들어야합니다. 그렇게하기 위해서는, 당신은 전처리의 "stringizing"연산자를 조사 할 수 있습니다 :이 매크로는 일정한 프리 프로세서에 적용, 그 이름 리터럴 C 문자열을 생성 할 수 있습니다

#define STR(X) #X 

:

const char *nameOfKDSomeItem = STR(KDSomeItem); // same as "KDSomeItem" 
+0

감사합니다. 대답을 수락하기 전에 몇 분 정도 기다려야합니다 ;-) –

0

아니요. 상수는 선행 처리 매크로입니다. 소스 코드에 텍스트로 대체됩니다.

관련 문제