2010-02-11 3 views
6

@encode가 주어진 객체, 구조체 또는 데이터 유형에있는 데이터 유형 요소를 형식 정의로 추출하여 인스턴스화를위한 클래스 설명자로 사용하는 방법을 설명 할 수 있습니까?Objective-C에서 @encode 컴파일러 지시문은 어떻게 구현됩니까?

또는 새로운 전 처리기 지시문 구현에 대해 배우기위한 몇 가지 리소스를 가리키는 포인터일까요?

+0

을 어떻게 든 구문 분석하고 전달되는 stringifies의 단지 기능 형 매크로를 생각하고 있어요 :

것은 내가 배우려고 노력하고있는 무슨에 관해서는 훨씬 더 분명하다 생각이 질문을 참조하시기 바랍니다 to it – Anderson

+0

'@ encode'는 어떻게 C 언어 (이 키워드가없는)와 관련이 있습니까? 'c'태그를 제거하는 것이 좋습니다. –

+1

'@ encode'는 전처리 지시어가 아니며, 전처리 기가 인식하지 못하는 형식의 크기와 같은 유형 정보에 의존합니다. – dreamlax

답변

1

원래 질문의 표현이 명확하지 않을 수 있으며 전처리 기와 관련된 가능한 구현에 대해 언급 한 결과 대화가 의도 한 질문보다는 컴파일러의 작동 방식을 바꾸려는 생각이 들었다고 생각합니다. How would I implement something similar to the Objective-C @encode() compiler directive in ANSI C?

+2

전 처리기가 모든 유형 정보를 전혀 알지 못하기 때문에 전처리 기에서 수행 할 수 없습니다. – dreamlax

5

@encode 지시문은 제공된 유형을 구문 분석하고 해당 유형을 기반으로 상수 문자열을 생성합니다. 모든 C 기본 유형 (부호있는 버전과 부호없는 버전 포함) 및 Objective-C idSEL 유형의 인코딩은 모두 단일 문자 인코딩을 사용하며 <objc/runtime.h>에서 찾을 수 있습니다. struct과 같은 더 복잡한 유형과 배열에는 더 큰 인코딩이 있습니다.

자세한 내용은 Objective-C Runtime Programming Guide [PDF]을 참조하십시오.

+0

도움을 주셔서 감사합니다.하지만 그것이 무엇을하는지 압니다. 나는 그것이 그것을하는 방법에 흥미가있다. – Anderson

+2

소스가 AST로 파싱되면,'@ encode' 메소드는 아마도 트리를 가로 질러 개별 타입을 검사하고 그것으로부터 문자열을 생성합니다. – dreamlax

+0

내가 이해하는 방식은 컴파일 타임에 @encode 지시문을 사용하여 각 클래스의 @interface 헤더 내용을 사용하여 형식 설명자가 생성된다는 것입니다. 이러한 유형 설명자는 바이너리 내에 저장되고 .ctors 섹션은 런타임에 __attribute __ ((생성자)) 함수를 사용하여 각 클래스 객체를 인스턴스화합니다. – Anderson