2013-12-23 4 views
4

안녕하세요 몇 가지 목표 - C 코드를 검토하고 다음 문을 발견했다 : 어떤이 의미 않습니다OBJC_EXTERN : 목적은 무엇입니까?

OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);

를? 또한이 문장의 구문은 무엇입니까? 미리

답변

5

OBJC_EXTERN

덕분

#if !defined(OBJC_EXTERN) 
# if defined(__cplusplus) 
#  define OBJC_EXTERN extern "C" 
# else 
#  define OBJC_EXTERN extern 
# endif 
#endif 

<objc/objc-api.h> 정의하므로 설명 예로서 상기 선언 소스 파일 ++는 C에서 포함 하더라도 "맹 글링 C++ 이름"을 방지한다 여기 :

순수 C 코드의 경우 함수 선언에 extern 키워드가 필요하지 않으므로 OBJC_EXTERN 만 제거 할 수 있습니다.


NS_FORMAT_FUNCTION은 또한 연타하여 를 GCC는 특정 확장자 알

#define NS_FORMAT_FUNCTION(F,A) __attribute__((format(__NSString__, F, A))) 

__attribute__((format(...)))과 같이 정의된다 :

컴파일러는 가변 인수 목록 의 수와 유형을 형식 문자열과 비교하여 검사 할 수 있습니다. %s 문자열에 대한 자리 표시 자입니다 때문에 예를 들어

CLSLog(@"%s", 123); 

는, 컴파일러 경고가 발생할 것 하지만 123는 정수입니다.

+0

그리고 extern에 대한 구문이 있습니까? 이 특별한 경우, 진술의 의미는 무엇입니까? – pinker

+0

아, 또 다른 C++ 쓰레기. – Tricertops

+0

@pinker :'extern'은 (대략적으로 말하면) "전역 변수"를 선언하는 데 필요합니다. 완벽하고 완벽한 설명은 http://stackoverflow.com/a/1433387/1187415를 참조하십시오. 고대 컴파일러가 함수 프로토 타입을 위해 extern 키워드를 요구했을 수도 있습니다. –

관련 문제