2011-02-12 12 views
7

오브젝티브 C는 같은 지시어가있다 정교한 마르코 또는 코드 생성기와 같은 것들. 코드 생성 목적으로 사용자 지정 지시문을 만들 수 있습니까? 한 가지 가능한 용도는 CoreData에 대한 메소드를 생성하는 것입니다. 나는 그것에 대해 아무것도 본 적이 없어,하지만 내 세상은 세상이 아니기 때문에Objective-C에서 사용자 지정 지시문을 만들 수 있습니까?</p> <ul> <li>@interface</li> <li>@implementation</li> <li>@end</li> <li>@protocol 내가 생각</li> <li>@property</li> <li>@synthesize</li> </ul> <p>:

내가 아니라 생각하고 있어요.


후속 조사 질문 :

조나단은 자신의 처리기를 작성할 수 있습니다이 방법의 질문을 구걸 것을 아래에 언급. 현재 #define SYMBOLIC_CONSTANT 102는 파일이 컴파일러로 이동하기 전에 문자 SYMBOLIC_CONSTANT의 모든 인스턴스를 파일의 문자 102로 바꿉니다. 나는 그것이 당신이 대상에 "스크립트 실행 단계"를 추가 할 수 있습니다 Xcode를 알고

프로세스를 구축 할 수 있습니다. 그래서 '$ coredata'와 같은 커스텀 전처리 지시어를 찾아서 $ coredata를 코드의 일부 문자로 대체 한 새로운 파일을 생성하도록 스크립트를 작성할 수 있습니다. 하지만 Xcode의 빌드 프로세스에 대해 이해한다면 변경된 파일을 컴파일러 소스 단계에 공급할 수는 없습니다. 파일은 IDE에 의해 지정되고 잠겨집니다.

누구나 비슷한 일을 했습니까? 외부 구축 시스템을 사용하는 것이 가능하다는 것을 알고 있지만 솔직히 말해서 나는 그 정도의 이해 수준이 아닙니다. Build and Run 버튼의 기술적 세부 사항을 알지 못합니다. 한편

, 나는 애플의 엑스 코드 문서 ... 응답에 대한

감사를 읽기 시작합니다!

+0

나는 그것이 쉽게 멀다고 말하지 않았다. 그러나'$ coredata'와 같은 것은 유효한 C 전처리 기 토큰입니다 ('$'는 기호/매크로 이름에서 사용될 수 있습니다). 그래서'#define' 문에서 사용할 수 있습니다. 다시 말하지만, 귀하가 우리에게 목표를 말하면, 우리는 문제에 대한보다 쉽고 나은 접근 방법을 제안 할 수 있습니다. –

답변

3

당신의 생각은 올바른 : 당신의 코드에서이 작업을 수행하는 것은 불가능합니다. @ 지시문을 추가하는 유일한 방법은 컴파일러 자체를 사용하는 것입니다. 이러한 모든 문제에 직면했다하더라도, 지원되는 구문 강조 표시가 어딘가에 Xcode 구성 파일에 하드 코딩되어 있다는 것을 거의 보장 할 수 있습니다.

아, 프로세서 전처리 매크로를 사용하려는 경우 @ 문자는 프로세서 전제 매크로에서 유효하지 않습니다.

편집 : 테스트를 실시했는데 정확합니다. C 전처리 기 매크로에서 @ 문자를 사용하는 것은 불법입니다. 변수 이름과 동일한 규칙을 따릅니다.

+2

전처리 매크로 사용에 대해서는 언급하지 않았다. 내 대답을 다시 읽으십시오. –

3

당신은 목표 - C의 범위 내에서 의미? 아니요, 새 키워드를 인식 할 수있는 방법이 없으므로 @whatever을 감지 할 수있는 전 처리기를 작성하여 코드로 변환 할 수 있지만 구체적으로 수행 할 작업을 Google에 알려 주면보다 효율적이거나 최적의 방법을 제안 할 수 있습니다.

+1

C 전 처리기 매크로에서 @ 문자가 잘못되었습니다. –

+0

응답 해 주셔서 감사합니다. 당신은 나에게이 일을하는 방법에 대한 아이디어를주었습니다. 코드를 생성하기 위해 언어 훅이 필요 없다는 사실을 잊어 버렸습니다. – Tobias

+2

@Carter : 나는 preprocessor를 작성했다. * inbuilt *를 사용하지 않았다. *. 자체 커스텀 전처리기를 필요로하는 코드를 사용하고 싶지는 않습니다. (오, 잠깐, 나는 Objective-C를 매일 사용한다 ...) –

0

불가능합니다. Objective-C 언어에 내장 된 키워드입니다. 그 (것)들의 앞에 @가 있기 때문에 다만 다른 키워드와 다른 만들지 않는다.

5

허용되는 대답은 맞지만,이 종류의 문제에 대한 부분적인 해킹 해결책이 있습니다. libextobjc 라이브러리가이를 채택합니다.

id foo = [[NSObject alloc] init]; 
id bar = [[NSObject alloc] init]; 

@weakify(foo, bar); 

라이브러리의 저자는 here을 설명합니다 :

#define weakify(...) \ 
    try {} @finally {} \ 
    metamacro_foreach_cxt(ext_weakify_,, __weak, __VA_ARGS__) 

이러한 정의는 다음과 같은 형태로 weakify 키워드를 사용 할 수 있습니다 :

당신이 거기에 다음과 같은 정의를 찾을 수 있습니다, this code 고려

매크로는 @ pre와 함께 사용되기 때문에 (@strongify (self);와 같이) 과 대치하면 try {}가 심볼을 흡수하여 이 구문 오류를 발생시키지 않도록합니다.


업데이트 이후

From now on libextobjc는 "기호를 흡수"하는 @autoreleasepool를 사용합니다.

+0

* 한숨, 끔찍한 해킹으로 큰 설명 – TheCodingArt