полностью определяют пути заголовков в отдельных файлах реализации на основе одного из определенных вами каталогов поиска:
#include <MONProject/Source/ExampleSentencesViewController.h>
против
#include <MONSecondProject/Source/ExampleSentencesViewController.h>
обновление на основе уточнения:
в идеале вы должны создать статическую библиотеку для общего кода.
для простого случая ... вы может принять прямой подход, заполнив заголовок в корне вашего проекта с именем ExampleSentencesViewController.h
и заполнив его следующим образом:
/* you must define either MON_BUILD_MON_FIRST_PROJECT or MON_BUILD_MON_SECOND_PROJECT at the target level */
#if (defined(MON_BUILD_MON_FIRST_PROJECT) && defined(MON_BUILD_MON_SECOND_PROJECT))
#error invalid configuration: you cannot specify both projects to be compiled
#elif defined(MON_BUILD_MON_FIRST_PROJECT)
/* some fully qualified path: */
#include <MONFirstProject/ExampleSentencesViewController.h>
#elif defined(MON_BUILD_MON_SECOND_PROJECT)
/* some other fully qualified path: */
#include <MONSecondProject/ExampleSentencesViewController.h>
#else
#error uh... which project are you trying to build?
#endif
или вы можете просто использовать эти определения для условного включения /отключите интерфейс и реализацию классов с дублирующимися именами (а затем просто включите их оба в объявление проекта:
/* MONFirstProject/ExampleSentencesViewController.h> */
#if defined(MON_BUILD_MON_FIRST_PROJECT)
@interface ExampleSentencesViewController : NSViewController
/* ... */
@end
#endif
… но для этого потребуется включить оба заголовка в ваш дистрибутив (если применимо).
некоторые подробности включения могут отличаться в зависимости от того, как вы объявили свои пути поиска (например, рекурсивны они или нет?) И используете ли вы фазы сборки заголовков копирования в своем xcodepРож.поддержание обоих проектов с общим кодом может стать грязным, если вы слишком расслаблены в своих директивах включения, опциях обнаружения, объявлениях препроцессора (условная компиляция / видимость) и / или конфигурациях сборки, поэтому ... поэтому я рекомендую библиотеку для общегобиты.этот условный материал (в двух предыдущих примерах) подвержен ошибкам и плохо развивается или масштабируется.это также хороший способ запутать другие инструменты в наборе инструментов разработки.
На самом деле, я предпочитаю это перед препроцессором (при условии, что вы можете распределить оба класса):
- (UIViewController *)newViewControllerForMyAwesomeView {
if (IsAppMONFirstProject) {
return [[MONFirstProjectViewController alloc] init...];
}
else if (IsAppMONSecondProject) {
return [[MONSecondProjectViewController alloc] init...];
}
else {
assert(0 && "definitely break up your code, now that it is referenced by 3 or more projects");
return 0;
}
}
если вы просто поддерживаете две версии одного и того же заголовка, то практики будут сильно отличаться.
в любом случае ... этого должно быть достаточно идей для решения вашей проблемы - вы простонадо определить меньшее зло.