2010-01-13 7 views
24

목표 C에서 __OBJC__은 무엇을 의미합니까?객관적인 C에서 __OBJC__

#import <Availability.h> 

#ifdef __OBJC__ 
    #import <Foundation/Foundation.h> 
    #import <UIKit/UIKit.h> 
#endif 

답변

28

을 이것은 미리 컴파일 된 헤더 파일과 같습니다.

미리 컴파일 된 헤더는 프로젝트의 모든 C- dialect 파일간에 공유됩니다. 마치 모든 .c, .cpp, .m 및 .mm 파일에 보이지 않는 #include 지시문이 첫 번째 줄에있는 것처럼 보입니다. 하지만 Cocoa 헤더 파일은 순수한 Objective C입니다. C/C++ 소스에 포함 시키려하면 구문 오류 만 발생합니다. 따라서 #ifdef.

프로젝트에 일반적인 경우 인 Objective C 파일 (.m/.mm) 만있는 경우 #ifdef는 실제로 필요하지 않습니다. 그러나 처음부터이 헤더를 생성 한 Xcode는 여러분 모두를 보호합니다.

PCH 파일이 아니더라도이 #ifdef는 파일이 Objective C와 일반 C/C++에서 모두 포함되는 경우에만 의미가 있습니다. 그러나 그것은 상관없이 상처를주지 않습니다.

1

그냥 매크로 기호입니다. 이 경우 심볼이 정의되어 있으면 프로그램에서 Apple Cocoa 프레임 워크 (Foundation 및 AppKit)를 가져와야합니다.

객관적인 c/코코아 응용 프로그램을 개발하는 경우에 해당됩니다. 즉, C++/탄소 응용 프로그램을 개발하는 경우 OBJC 기호가 정의되지 않고 해당 objective-c 종속 프레임 워크를 가져올 수 없습니다.

33

이것은 객관적인 C 컴파일러가 사용되고 있음을 의미합니다. 따라서 객관적인 C 또는 C 또는 C++를 컴파일 할 때 사용할 수있는 하이브리드 헤더 파일을 만들 수 있습니다.

당신이 C와 C++ 프로그래머/코드를 사용할 수 있도록하고 싶었 객관적 C 객체 정의 된 헤더 파일 게시하기를 원한다면 당신은이 같은 헤더 파일을 사용할 수 있습니다

#ifndef MYHEADER_H 
#define MYHEADER_H 

#ifdef __OBJC__ 
// Put objective C things in this block 
// This is an objc object implemented in a .m or .mm file 
@implementation some_objc_object { 
} 
@end 
#endif 

#ifdef __cplusplus 
#define CLINKAGE "C" 
// c++ things that .m or .c files wont understand go in here 
// This class, in a .mm file, would be able to call the obj-c objects methods 
// but present a c++ interface that could be called from c++ code in .cc or .cpp 
// files 
class SomeClassThatWrapsAnObjCObject 
{ 
    id idTheObject; 
public: 
    // ... 
}; 
#endif 
// and here you can declare c functions and structs 
// this function could be used from a .c file to call to a .m file and do something 
// with the object identified by id obj 
extern CLINKAGE somefunction(id obj, ...); 
#endif // MYHEADER_H 
관련 문제