2010-01-13 16 views
24

¿Qué significa __OBJC__ en Objetivo C?__OBJC__ en el objetivo C

#import <Availability.h> 

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

Respuesta

28

Esto se parece a su archivo de encabezado precompilado.

El encabezado precompilado se comparte entre todos los archivos C-dialect de su proyecto. Es como si todos sus archivos .c, .cpp, .m y .mm tuvieran una directiva #include invisible como primera línea. Pero los archivos de encabezado de Cocoa son puro Objective C: tratar de incluirlos en una fuente de C/C++ no arrojará más que errores de sintaxis. Por lo tanto, el #ifdef.

Si su proyecto solo contiene archivos Objective C (.m/.mm), que es el caso típico, el #ifdef no es realmente necesario. Pero Xcode, que generó este encabezado en primer lugar, te protege de todos modos.

Incluso si no es un archivo PCH, este #ifdef solo tiene sentido si el archivo debe incluirse tanto en Objective C como en C/C++. Pero no duele, independientemente.

1

Es solo un símbolo de macro. En este caso, si ese símbolo está definido, su programa debería importar los marcos Apple Cocoa (Foundation y AppKit).

Este sería el caso si estuviera desarrollando una aplicación object-c/cocoa. En otras palabras, si estaba desarrollando una aplicación de C++/carbono, el símbolo OBJC no se definiría y los marcos dependientes de Object-C no se importarían.

33

Significa que se está utilizando el compilador Object C. De modo que puede crear archivos de encabezado híbridos que se pueden usar al compilar el objetivo C o C o C++.

Usted podría utilizarlo en un fichero de cabecera de este tipo, si desea publicar un archivo de cabecera que define un objeto c objetivo que quería poner a disposición de C y C++ programadores/Código:

#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