如何在 Xcode 中定义预处理器符号
Posted
技术标签:
【中文标题】如何在 Xcode 中定义预处理器符号【英文标题】:How to define a preprocessor symbol in Xcode 【发布时间】:2010-09-26 21:53:05 【问题描述】:是否可以通过在Xcode项目中设置属性来设置条件编译的符号?
我的目标是创建一个对所有文件都可用的符号,而不必使用导入/包含,这样一组常见的类就可以在某些项目中具有特殊的行为。如下所示,但带有我自己的符号。
#if TARGET_IPHONE_SIMULATOR
...
#endif
【问题讨论】:
相关:“Add preprocessor macro to a target in xcode 6” 【参考方案1】:转到您的目标或项目设置,单击左下方的齿轮图标,然后选择“添加用户定义的设置”。新设置名称应为 GCC_PREPROCESSOR_DEFINITIONS
,您可以在右侧字段中输入您的定义。
根据 Steph 的 cmets,完整的语法是:
constant_1=VALUE constant_2=VALUE
请注意,如果您只想#define 一个符号而不是给它一个值(对于#ifdef
语句),则不需要“=”
【讨论】:
谢谢!对于感兴趣的人,语法看起来像“kVarOne=5 myVar=3.0”(不带引号),我通过反复试验找到了它。本你能编辑你的答案来指定吗?再次感谢。 惊人的答案。因为这个,我还有头发。谢谢你,谢谢你,谢谢你。 +1(我希望它可以更多) 仅供参考,从 Xcode 3.2.4 开始,“预处理器宏”映射到 GCC_PREPROCESSOR_DEFINITIONS,Xcode 将不再允许您进行用户定义(因为它已经可用)。 这不再是左下角的齿轮图标,而是右下角的加号图标(目标的构建设置选项卡)。 您应该更新此响应。没有齿轮图标了【参考方案2】:您无需创建用户定义的设置。内置设置“预处理器宏”工作得很好。 alt text http://idisk.mac.com/cdespinosa/Public/Picture%204.png
如果您有多个使用相同前缀文件的目标或项目,请改用 Preprocessor Macros Not Used In Precompiled Headers,这样您的宏定义的差异不会触发一组不必要的额外预编译头文件。
【讨论】:
如果构建设置中缺少此部分怎么办? 按照 Ben Gotliebb 的建议去做。但从 Xcode 3.2.4 版开始,“预处理器宏”映射到 GCC_PREPROCESSOR_DEFINITIONS。你不能用户定义已经可用的东西。【参考方案3】:作为附录,如果您使用这种技术在目标中定义字符串,这就是我必须定义和使用它们的方式:
在 Build Settings -> Preprocessor Macros 中,是的,反斜杠在定义中很关键:
APPURL_NSString=\@\"www.foobar.org\"
并在源代码中:
objectManager.client.baseURL = APPURL_NSString;
【讨论】:
感谢这个解决方案,一直在寻找完全一样的东西,但是堆栈溢出充满了过于复杂的解决方案。【参考方案4】:您可以使用*_Prefix.pch
文件来声明项目范围的宏。
该文件通常在您的Other Sources组中。
【讨论】:
【参考方案5】:它在“GCC 4.2 Preprocessing”下(或者只是在搜索框中输入“prepro”)...
...但是,在我的一生中,我无法让它工作。
我有标准的调试和发布配置,我想在调试配置中定义 DEBUG=1。但将其作为值添加后:
(在设置窗口中)> 预处理器宏:DEBUG=1
#if DEBUG
printf("DEBUG is set!");
#endif
...从不打印/被调用。快把我逼疯了……
【讨论】:
代替#if DEBUG,尝试#if defined(DEBUG) 或#ifdef DEBUG 奇怪的是,我在 2019 年发现自己在这里,使用 Swift 和 Xcode 10.3。遇到上述相同问题的任何人都可能会觉得这很有帮助;它确实让我的#if DEBUG
栩栩如生:) ***.com/a/47395485/2778502【参考方案6】:
适用于 Xcode 9.4.1 和 C++ 项目。将 const char*
预处理器宏添加到 Debug 和 Release 构建。
选择你的项目
选择构建设置
搜索“预处理器宏”
打开交互列表
添加你的宏,不要忘记转义引号
在源代码中常用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");
...
【讨论】:
【参考方案7】:针对 Kevin Laity 的评论(请参阅 cdespinosa 的回答),关于 GCC Preprocessing 部分未显示在您的构建设置中,请将 Active SDK 设置为在它之后显示(Base SDK)的那个,这部分将出现。您可以通过选择菜单 Project > Set Active Target > XXX (Base SDK) 来执行此操作。在不同版本的 XCode(Base SDK)中可能会有所不同,例如(Project Setting 或 Project Default)。
看到此部分后,您可以将定义添加到处理器宏中,而不是创建用户定义的设置。
【讨论】:
【参考方案8】:您可以复制具有预处理部分的目标,将其重命名为您想要的任何名称,然后更改您的预处理器宏值。
【讨论】:
以上是关于如何在 Xcode 中定义预处理器符号的主要内容,如果未能解决你的问题,请参考以下文章
在没有预处理器宏的情况下,有没有办法在 Xcode 项目的项目级别定义实用的方案特定标志
基于 NuGet PackageReference 定义一个 C# 预处理器符号