如何在Xcode中定义预处理器符号


100

通过在Xcode项目中设置属性,可以为条件编译设置符号吗?

我的目标是创建一个可用于所有文件的符号,而不必使用import / include,以便一组通用类在某些项目中可以具有特殊的行为。如下所示,但带有我自己的符号。

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

Answers:


116

转到目标或项目设置,单击左下方的Gear图标,然后选择“添加用户定义的设置”。新的设置名称应为GCC_PREPROCESSOR_DEFINITIONS,您可以在右侧字段中输入定义。

根据Steph的评论,完整语法为:

constant_1=VALUE constant_2=VALUE

请注意,如果您只想#define符号而不是给它赋值(用于语句),则不需要 '='。#ifdef


2
谢谢!对于感兴趣的人,语法看起来像“ kVarOne = 5 myVar = 3.0”(不带引号),我通过反复试验发现了它。Ben您可以编辑答案以指定答案吗?再次感谢。
Steph Thirion

1
惊人的答案。因此,我仍然有头发。谢谢你,谢谢你,谢谢你。+1(我希望可以更多)
阿里·帕尔

11
仅供参考,从Xcode 3.2.4开始,“预处理器宏”映射到GCC_PREPROCESSOR_DEFINITIONS,并且Xcode将不再允许您进行用户定义(因为它已经可用)。
粘土桥

11
这不再是左下角的Gear图标,而是右下角(目标的“构建设置”标签的)加号图标。
杰西·史密斯

1
您应该更新此回复。没有齿轮图标了
Radu Simionescu

86

您无需创建用户定义的设置。内置设置“ Preprocessor Macros”可以正常工作。 替代文字http://idisk.mac.com/cdespinosa/Public/Picture%204.png

如果您有多个使用相同前缀文件的目标或项目,请改用“未在预编译头中使用的预处理器宏”,因此宏定义中的差异不会触发不必要的额外预编译头集。


1
如果构建设置中缺少此部分,该怎么办?
凯文·莱蒂

3
照本·戈特列布的建议去做。但是从Xcode的3.2.4版本开始,“预处理器宏”会映射到GCC_PREPROCESSOR_DEFINITIONS。您无法用户定义已经可用的内容。
粘土桥

41

作为附录,如果您使用此技术在目标中定义字符串,这就是我必须定义和使用它们的方式:

在Build Settings-> Preprocessor Macros中,是的反斜杠对于定义至关重要:

APPURL_NSString=\@\"www.foobar.org\"

并在源代码中:

objectManager.client.baseURL = APPURL_NSString;

感谢这个解决方案,一直在寻找完全像这样的东西,但是堆栈溢出充满了复杂的解决方案。
David P

5

您可以使用该*_Prefix.pch文件来声明项目范围的宏。该文件通常在您的“ 其他来源”组中。


3

它在“ GCC 4.2预处理”下(或只需在搜索框中输入“ prepro”)...

...但是,对于我的一生,我无法使它运转。

我有标准的Debug和Release配置,我想在调试配置中定义DEBUG = 1。但是将其添加为值后:

(在设置窗口中)> Preprocessor Macros:DEBUG = 1

#if DEBUG
    printf("DEBUG is set!");
#endif 

...从不打印/获取呼叫。这让我疯狂...


10
而不是#if DEBUG,请尝试#if defined(DEBUG)或#ifdef DEBUG
Simo Salminen 2010年

奇怪的是,我在2019年遇到了Swift和Xcode 10.3。具有上述相同问题的任何人都可能会发现此帮助。它肯定使我#if DEBUG栩栩如生:) stackoverflow.com/a/47395485/2778502
jeff-h

1

为了回应Kevin Laity的评论(请参阅cdespinosa的回答),关于您的构建设置中未显示“ GCC预处理”部分,请使Active SDK成为在其后显示“(Base SDK)”的部分,然后出现此部分。您可以通过选择菜单项目>设置活动目标> XXX(基本SDK)来执行此操作。在不同版本的XCode(基本SDK)中,可能有所不同,例如(项目设置或项目默认值)。

显示此部分后,您可以将定义添加到“处理器宏”中,而不用创建用户定义的设置。


1

对于Xcode 9.4.1和C ++项目。将const char*预处理器宏添加到DebugRelease版本。

  1. 选择你的项目

    选择项目

  2. 选择构建设置

    选择构建设置

  3. 搜索“ 预处理器宏

    搜索1 搜索2

  4. 开启互动清单

    打开互动列表

  5. 添加您的宏,别忘了用引号引起来

    添加路径

  6. 在源代码中作为通用使用 const char*

    ...
    #ifndef JSON_DEFINITIONS_FILE_PATH
    static constexpr auto JSON_DEFINITIONS_FILE_PATH = "definitions.json";
    #endif
    ...
    FILE *pFileIn = fopen(JSON_DEFINITIONS_FILE_PATH, "r");
    ...

0

您可以复制具有预处理部分的目标,将其重命名为所需的任何名称,然后更改预处理器宏值。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.