我可以在编译时检测项目中的文件吗?

时间:2013-10-23 09:31:20

标签: ios objective-c c-preprocessor xcode-project

我们有一套共享一组常用屏幕的应用程序。有些屏幕在某些应用中使用的功能比其他应用更多。例如,在一个应用程序中,我们的问题屏幕支持标签,但在其他应用程序中则不支持。在一个方面,我们的区域屏幕支持工作流程,但在其他区域则不支持。

我们正在使用核心数据,不同的应用程序有不同的数据模型;如果应用程序的数据模型未使用实体,则相应的类不会内置到该应用程序中。

这样做的结果是我们的一些控制器包含对在特定应用程序中使用控制器时可能存在或可能不存在的类的引用。目前,我们在应用程序的PCH文件中使用“magic”#defines来解决这个问题。所以我们的问题控制器中的一些代码包含在#ifdef SGB_ISSUES_HAVE_TAGS中,而区域控制器中的一些代码包含在#ifdef SGB_REGIONS_ARE_FILTERED_BY_WORKFLOW中。

我想要的是通过检测文件是否已包含在项目中来执行此操作。所以在我们的问题控制器的顶部我会有这样的事情:

#if exists_in_project("SGBIssueTag.h")
#import "SGBIssueTag.h"
#endif

然后我可以将#ifdef SGB_ISSUES_HAVE_TAGS放入SGBIssueTag.h;我们构建的使用问题控制器的任何应用程序都会在我们包含IssueTag实体后立即获得问题标记功能,而且我们不必乱用PCH文件。

这样的事情可能吗?

1 个答案:

答案 0 :(得分:0)

这个问题困扰了很多人 - 头文件对项目来说是“全局”的问题。

我的建议是在编译期间尝试强制错误。您可以添加PCH或其中包含的文件定义每个应用程序 - 假设您有应用程序A,B和C.因此在任何一个构建期间,只有其中一个是活动的。

然后,在每个.m文件(可能还有一些.h文件)中,您将有条件地包含标题:

...
#if defined(A) || defined(B)
#include "SomeInterfaceFile.h"
#endif
...

一旦开始构建A,您将在文件中获得编译错误,其中源代码引用在超出范围的头文件中定义的某个对象。该代码还必须包含在类似的if语句中。

这将完美地运行,但缺点是您的代码会被这些条件语句弄得乱七八糟。