2010-01-13 9 views
24

Was bedeutet __OBJC__ in Objective C?__OBJC__ in Ziel C

#import <Availability.h> 

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

Antwort

28

Dies sieht wie Ihre vorkompilierte Header-Datei aus.

Der vorkompilierte Header wird von allen C-Dialektdateien in Ihrem Projekt gemeinsam verwendet. Es ist so, als ob alle Ihre .c, .cpp, .m und .mm Dateien eine unsichtbare # include Direktive als erste Zeile haben. Aber die Cocoa-Header-Dateien sind reine Objective C - der Versuch, sie in eine C/C++ - Quelle einzuschließen, wird nichts außer Syntaxfehlern liefern. Also die #ifdef.

Wenn Ihr Projekt nur Objective-C-Dateien (.m/.mm) enthält, was der typische Fall ist, ist das #ifdef nicht wirklich notwendig. Aber Xcode, der diesen Header überhaupt erzeugt hat, schützt Sie trotzdem.

Auch wenn es keine PCH-Datei ist, macht diese #ifdef nur Sinn, wenn die Datei sowohl aus Objective C als auch aus Plain C/C++ eingefügt werden soll. Aber es tut nicht weh, egal.

1

Es ist nur ein Makro-Symbol. In diesem Fall sollte Ihr Programm die Apple Cocoa Frameworks (Foundation und AppKit) importieren, wenn dieses Symbol definiert ist.

Dies wäre der Fall, wenn Sie eine objective-c/cocoa-Anwendung entwickeln würden. Mit anderen Worten, wenn Sie eine C++/Carbon-Anwendung entwickeln würden, würde das Symbol OBJC nicht definiert und diese objective-c-abhängigen Frameworks würden nicht importiert.

33

Es bedeutet, dass der objektive C-Compiler verwendet wird. So können Sie Hybrid-Header-Dateien erstellen, die beim Kompilieren von Ziel C oder C oder C++ verwendet werden können.

Sie es in einer Header-Datei wie diese verwenden können, wenn Sie eine Header-Datei, die definiert ein objektives c Objekt veröffentlichen wollte, den Sie C und C++ Programmierer/Code verfügbar machen wollte:

#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