안녕하세요 몇 가지 목표 - C 코드를 검토하고 다음 문을 발견했다 : 어떤이 의미 않습니다OBJC_EXTERN : 목적은 무엇입니까?
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
를? 또한이 문장의 구문은 무엇입니까? 미리
안녕하세요 몇 가지 목표 - C 코드를 검토하고 다음 문을 발견했다 : 어떤이 의미 않습니다OBJC_EXTERN : 목적은 무엇입니까?
OBJC_EXTERN void CLSLog(NSString *format, ...) NS_FORMAT_FUNCTION(1,2);
를? 또한이 문장의 구문은 무엇입니까? 미리
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
는 정수입니다.
그리고 extern에 대한 구문이 있습니까? 이 특별한 경우, 진술의 의미는 무엇입니까? – pinker
아, 또 다른 C++ 쓰레기. – Tricertops
@pinker :'extern'은 (대략적으로 말하면) "전역 변수"를 선언하는 데 필요합니다. 완벽하고 완벽한 설명은 http://stackoverflow.com/a/1433387/1187415를 참조하십시오. 고대 컴파일러가 함수 프로토 타입을 위해 extern 키워드를 요구했을 수도 있습니다. –