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

107

能否通过在Xcode项目中设置属性来为条件编译设置符号?

我的目的是创建一个符号,可供所有文件使用,无需使用import/include,以便一组公共类在某些项目中具有特殊行为。类似于以下示例,但使用自己的符号。

#if TARGET_IPHONE_SIMULATOR
    ...
#endif

8个回答

118

前往您的目标或项目设置,在左下方点击齿轮图标,然后选择“添加用户定义设置”。新设置名称应为GCC_PREPROCESSOR_DEFINITIONS,您可以在右侧字段中输入定义内容。

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

constant_1=VALUE constant_2=VALUE

注意,如果你只想定义一个符号而不是给它赋值(对于#ifdef语句),那么你不需要使用"="。


2
谢谢!对于任何感兴趣的人,语法看起来像“kVarOne=5 myVar=3.0”(不带引号),我是通过试错找到的。Ben,你能编辑你的答案并指明吗?再次感谢。 - Steph Thirion
2
精彩的答案。我还能保留我的头发都因为这个。谢谢,谢谢,谢谢。(我希望我能再多给一分) - Ali Parr
11
作为FYI,从Xcode 3.2.4开始,“Preprocessor Macros”对应GCC_PREPROCESSOR_DEFINITIONS,而且Xcode不再允许您进行用户定义(因为已经可用)。 - Clay Bridges
12
在目标的“生成设置”选项卡下,左下角的“齿轮”图标已经不存在了,改为右下角的“加号”图标。请注意更新。 - JTE
3
您应该更新这个回复。现在没有齿轮图标了。 - Radu Simionescu
显示剩余2条评论

86
您不需要创建用户定义的设置。内置设置“预处理器宏”就可以正常工作。 alt text http://idisk.mac.com/cdespinosa/Public/Picture%204.png 如果您有多个目标或项目使用相同的前缀文件,请改用“未在预编译头中使用的预处理器宏”,这样您的宏定义差异就不会触发不必要的额外预编译头集合。

1
如果构建设置中缺少此部分,您该怎么做? - Kevin Laity
3
按照Ben Gotliebb的建议去做。但是从Xcode 3.2.4版本开始,“预处理宏”对应的是GCC_PREPROCESSOR_DEFINITIONS。你不能自定义已经可用的内容。 - Clay Bridges

44

作为一种补充,如果您正在使用这种技术来定义目标中的字符串,那么这就是我必须定义和使用它们的方式:

在构建设置->预处理器宏中,是的,反斜杠在定义中很关键:

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

还有在源代码中:

objectManager.client.baseURL = APPURL_NSString;

感谢您提供的解决方案,我一直在寻找像这样精确的解决方案,但是 Stack Overflow 上充满了过于复杂的解决方案。 - David P

5
你可以使用*_Prefix.pch文件来声明项目范围内的宏定义。 该文件通常位于你的其他源代码组中。

4

对于Xcode 9.4.1和C++项目,需要在DebugRelease构建中添加const char*预处理器宏。

  1. Select your project

    select project

  2. Select Build Settings

    select build settings

  3. Search "Preprocessor Macros"

    search1 search2

  4. Open interactive list

    open interactive list

  5. Add your macros and don't forget to escape quotation

    add path

  6. Use in source code as common 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");
    ...
    

4

在“GCC 4.2预处理”下可以找到它(或者在搜索框中输入“prepro”)...

...然而,我却无论如何都无法让它工作。

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

(在设置窗口中) > 预处理器宏:DEBUG=1

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

...从来没有被打印/调用。这真让我疯狂...


11
请用以下方式替换 #if DEBUG:#if defined(DEBUG)或者#ifdef DEBUG - Simo Salminen
有趣的是,我在2019年使用Swift和Xcode 10.3发现自己遇到了同样的问题。那些遇到类似问题的人可能会发现这篇文章有所帮助;它确实让我的#if DEBUG开始起作用 :) https://dev59.com/oFkT5IYBdhLWcg3wStkf#47395485 - jeff-h

1
针对Kevin Laity的评论(请参见cdespinosa的答案),关于GCC预处理部分未显示在您的构建设置中,请将Active SDK设置为标有(Base SDK)的那个,然后此部分将出现。您可以通过选择菜单Project>Set Active Target>XXX(Base SDK)来实现这一点。在不同版本的XCode中,(Base SDK)可能会有所不同,例如(Project Setting或Project Default)。
在您获得此部分之后,您可以将定义添加到Processor Macros而不是创建用户定义的设置。

0

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接