__OBJC__ в цели C - PullRequest
       15

__OBJC__ в цели C

24 голосов
/ 13 января 2010

Что означает __OBJC__ в Цели C?

#import <Availability.h>

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

Ответы [ 3 ]

34 голосов
/ 13 января 2010

Это означает, что используется целевой компилятор 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
28 голосов
/ 13 января 2010

Это похоже на ваш предварительно скомпилированный заголовочный файл.

Предварительно скомпилированный заголовок используется всеми файлами C-диалекта в вашем проекте. Как будто все ваши файлы .c, .cpp, .m и .mm имеют невидимую директиву #include в качестве первой строки. Но заголовочные файлы Какао - чистый Objective C - попытка включить их в исходный код C / C ++ не даст ничего, кроме ошибок синтаксиса. Таким образом, # ifdef.

Если ваш проект содержит только файлы Objective C (.m / .mm), что является типичным случаем, #ifdef на самом деле не нужен. Но Xcode, который сгенерировал этот заголовок в первую очередь, защищает вас все равно.

Даже если это не файл PCH, этот #ifdef имеет смысл, только если файл должен быть включен как из Objective C, так и из простого C / C ++. Но это не больно независимо.

1 голос
/ 13 января 2010

Это просто символ макроса. В этом случае, если этот символ определен, ваша программа должна импортировать фреймворки Apple Cocoa (Foundation и AppKit).

Это будет иметь место, если вы разрабатывали приложение target-c / cocoa. Другими словами, если вы разрабатываете приложение на C ++ / carbon, символ OBJC не будет определен, и эти зависимые от цели c-структуры не будут импортированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...