如何在 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* 预处理器宏添加到 DebugRelease 构建。

    选择你的项目

    选择构建设置

    搜索“预处理器宏

    打开交互列表

    添加你的宏,不要忘记转义引号

    在源代码中常用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 项目的项目级别定义实用的方案特定标志

删除 C# 二进制文件中未使用的预处理器符号

Xcode在哪里保存预处理器宏设置

基于 NuGet PackageReference 定义一个 C# 预处理器符号

如何知道(在 GCC 中)何时声明了给定的宏/预处理器符号?

使用预处理器宏进行条件编译 Xcode