【发布时间】:2021-01-26 03:31:12
【问题描述】:
这里是第一个问题。
我在使用 XCode 构建系统时遇到了一些问题,特别是在预处理器定义方面。
我正在尝试为 Objective-C 运行时定义一个宏,以避免强制将调度函数强制转换为适当的函数指针类型。通常的方法是使用#define OBJC_OLD_DISPATCH_PROTOTYPES,然后在下一行包含标题。一旦包含了标头,就已经定义了宏并相应地配置了标头。
但这就是它开始变得奇怪的地方!
该宏根本无法识别,并且包含了标头,就好像 #define 语句不存在一样,因此它无法 #define OBJC_OLD_DISPATCH_PROTOTYPES 并且它被(重新?)定义为 0。
main.c
#include <stdio.h>
#define OBJC_OLD_DISPATCH_PROTOTYPES 1
#include <objc/objc-runtime.h>
int main(int argc, const char * argv[]) {
// From there:
// - Build System: OBJC_OLD_DISPATCH_PROTOTYPES is always 0, except if defined in build settings
// - Clang (only): OBJC_OLD_DISPATCH_PROTOTYPES is 1
printf("%d\n", OBJC_OLD_DISPATCH_PROTOTYPES);
}
在“Apple Clang - Preprocessing”部分下的项目构建设置中定义预处理器宏时,构建系统会按预期运行。它使用clang 的-D 参数定义全局宏,使其可用于项目使用的任何文件。
但是,当我使用 clang main.c 从终端使用 clang 时,源代码可以正确编译。
有人可以告诉我需要配置什么才能使构建系统正常运行吗?
【问题讨论】:
-
在任何地方将
CONFIG更改为XYZ_PQR_ABC。你还遇到问题吗?如果不是,那么 XCode 系统可能会使用CONFIG本身。如果是这样,问题是别的。您尚未创建 MCVE(Minimal, Complete, Verifiable Example — 或 MRE 或 SO 现在使用的任何名称)或 SSCCE(Short, Self-Contained, Correct Example),因此我们无法判断您如何检测到CONFIG是0而不是1包含您的标题后。您是否已验证(使用编译器的-H选项)包含的是您的标头? -
我使用与我的问题匹配的 Objective-c 运行时编辑了问题以包含一个 MCVE。唯一定义
OBJC_OLD_DISPATCH_PROTOTYPES的地方是objc-api.h从第 100 行到第 110 行。 -
关闭前缀标题选项怎么样?
-
默认情况下似乎是不活动的,那里没有定义任何东西。
标签: ios c xcode macos xcodebuild