8

我试图在同一个 XCode 项目中拥有我的 iPhone 应用程序的 2 个版本。代码库几乎相同,在我需要有不同行为的地方我决定使用预处理器的条件和${TARGET_NAME}标签。

我已将 设置OTHER_CFLAGS为包含“ -DTARGET_NAME=${TARGET_NAME}”。

然后在我的代码中我试图做

#if TARGET_NAME == myApp
  NSLog(@"pro");
#elif TARGET_NAME == myAppLite
  NSLog(@"lite");
#endif

不幸的是,我总是打印出“lite”,因为TARGET_NAME == myApp它总是正确的:因为TARGET_NAME已定义。我一生都无法弄清楚如何评估这个字符串比较。任何的想法?

提前致谢

4

3 回答 3

11

你不能在一个#if块中比较这样的字符串。相反,将定义添加到每个特定目标。例如,在完整版的目标上,打开信息面板并转到构建选项卡,然后在构建设置中添加类似FULL_VERSION的内容。GCC_PREPROCESSOR_DEFINITIONS然后,对于 lite 目标,输入类似LITE_VERSION. 在您的代码中,您可以执行以下操作:

#ifdef FULL_VERSION
NSLog(@"Full");
#else
NSLog(@"Lite");
#endif
于 2009-06-22T13:11:47.940 回答
1

实际上,您可以获取目标的名称来比较它,但这不会在编译时跳过来自其他目标的不必要代码,这样做:

首先进入菜单 Product -> Scheme -> Edit Scheme...(或 CMD + <)然后在参数部分,添加内部环境变量,例如:

设置环境变量

在您的代码中,您可以获得目标的名称:

NSString *targetName = [[NSProcessInfo processInfo] environment][@"TARGET_NAME"];
NSLog(@"target = %@", targetName); // Will print the target's name

您现在可以在运行时比较该字符串。

但是按照您的示例:如果您希望在编译时省略所有 Pro 版本代码。你应该按照@jason-coco 所说的去做。并转到构建设置中的预处理器宏$(TARGET_NAME),并在那里添加:

在此处输入图像描述

如果我的目标是“MLBGoldPA”,#define 中的代码将被编译并执行

#if defined MLBGoldPA
    NSLog(@"Compiling MLBGoldPA");
#endif
于 2016-03-30T16:42:54.477 回答
-1

要使您的条件评估起作用,您必须执行以下操作:

#define myApp       1
#define myAppLite   2

事先,就像在你的 _Prefix.pch 文件中一样。

于 2009-07-15T01:40:16.857 回答