Что делает #ifdef __OBJC__ и почему библиотеки перечислены ниже? - PullRequest
5 голосов
/ 25 июля 2011

Я считаю, что директива #ifdef __OBJC__ гарантирует, что я импортирую следующие библиотеки классов только для Objective-C. Какова цель перечисления библиотек классов после оператора ifdef? Разве этот пример кода не побеждает цель?

#ifdef __OBJC__
#import <foundation/foundation.h>
#import <uikit/uikit.h>
#import <coredata/coredata.h>
#endif
</coredata/coredata.h></uikit/uikit.h></foundation/foundation.h>

Ответы [ 4 ]

3 голосов
/ 25 июля 2011

Objective-C - это расширенный набор C (как и C ++), и довольно часто файлы из разных языков будут использоваться в одном проекте и совместно использовать заголовки, особенно заголовок префикса. #ifdef __OBJC__, как и #ifdef __cplusplus, позволяет включать (или #import для Objective-C) заголовки только для соответствующего языка.

Для того же заголовка, включенного в файлы .c, .cpp и .m (с настройками компилятора по умолчанию), будет определено только __OBJ__ для файлов .m.

0 голосов
/ 25 июля 2011

Они перечислены после #endif просто как напоминание, что облегчает чтение кода.В противном случае вам придется посмотреть вверх, чтобы увидеть, чем заканчивался #endif.

0 голосов
/ 25 июля 2011

Причина, по которой это сделано, заключается в том, что этот код все еще может быть совместим с обычным кодом C, который может захотеть использовать функциональные возможности этого файла C (по крайней мере, для меня это выглядит). Включая эти библиотеки только тогда, когда определен OBJC, это гарантирует, что библиотеки будут импортированы ТОЛЬКО при компиляции для цели c, а не для стандартной C.

0 голосов
/ 25 июля 2011

В основном в этом коде, если вы используете Objective C, он импортирует эти 3 библиотеки

#import <foundation/foundation.h>
#import <uikit/uikit.h>
#import <coredata/coredata.h>

Цель этого if - не импортировать их, если в этом нет необходимости.

...