gpt4 book ai didi

ios - 使用 ONLY_ACTIVE_ARCH = NO 在本地计算机上编译时未遇到编译警告

转载 作者:可可西里 更新时间:2023-11-01 04:50:28 24 4
gpt4 key购买 nike

我有一个小问题,我不确定如何解决。

在我们的多个项目中,我们希望将“将警告视为错误”(GCC_TREAT_WARNINGS_AS_ERRORS) 更改为 YES

我们还想将“仅构建事件架构”(ONLY_ACTIVE_ARCH) 的 Xcode 默认项目设置保留为 YES(用于调试)和 NO 发布。

然而,这有一个主要缺点。代码如...

NSUInteger bob = 12234;
NSLog(@"bob %lu", bob);

应该产生以下类型的警告(因此在我们的例子中会产生错误):

Values of type 'NSUInteger' should not be used as format arguments; add an explicit cast to 'unsigned long' instead

然而,当开发人员在本地构建和测试时,他们不会遇到此警告/错误,但是当他们提交到我们的存储库并且我们的持续集成从命令行运行 xcodebuild 时,会遇到警告并且他们的构建失败。这显然是相当令人沮丧的。

我认为这与使用 Xcode 和从命令行使用 xcodebuild 时正在构建的架构之间的差异有关。

我在这里上传了一个示例项目...

https://github.com/OliverPearmain/ArchitectureDependantCompileWarning

我包含了 2 个方案。如果您使用“ArchitectureDependantCompileWarning”(它使用 Debug 构建配置,因此 ONLY_ACTIVE_ARCH==YES)为 iPhone 6S 模拟器编译,您不会收到任何警告并且编译正常。如果您使用“ArchitectureDependantCompileWarning-FAILS”方案(它使用 Release 构建配置,因此 ONLY_ACTIVE_ARCH==NO),则会遇到警告并且编译失败。

我想以某种方式确保在使用 ONLY_ACTIVE_ARCH==NO 构建模拟器时始终遇到此警告。这可能吗?

最佳答案

这是因为 5s 出现时字长发生了变化。换句话说,5s 和更高版本的 iPhone 有一个 64 位处理器,而所有以前的 iPhone 都有一个 32 位处理器。

这是 NSUInteger 的实际类型定义

#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
typedef long NSInteger;
typedef unsigned long NSUInteger;
#else
typedef int NSInteger;
typedef unsigned int NSUInteger;
#endif

您可以看到,对于 32 位处理器,NSUInteger 被显式定义为 unsigned int,而对于 64 位处理器,NSUInteger code> 被明确定义为 unsigned long

所以,看看这段代码...

NSUInteger bob = 12234;
NSLog(@"bob %lu", bob);

对于 4s,此 NSLog 不匹配,因为 NSUInteger 被明确定义为 unsigned int 并且格式说明符 % lu 是一个 unsigned long。这种非常明显的不匹配是 32 位处理器存在警告的原因。对于 64 位处理器,没有不匹配,因此没有警告。

警告中建议的修复假定您打算使用 unsigned long。但是,这里有一个替代解决方案。

NSUInteger bob = 12234;
#if __LP64__ || (TARGET_OS_EMBEDDED && !TARGET_OS_IPHONE) || TARGET_OS_WIN32 || NS_BUILD_32_LIKE_64
NSLog(@"bob %lu", bob);
#else
NSLog(@"bob %u", bob);
#endif

最重要的是,您要做的是在没有不匹配的情况下产生不匹配警告,这既不合适也不可能。

编辑:

这不是不匹配错误未能显示为警告/错误的情况。字面上没有不匹配。显示此错误的唯一方法是实际不匹配。如果您针对 NSUInteger 的定义会在您提到的特定代码中创建不匹配的体系结构进行构建,则只会出现不匹配。已经有一种标准方法可以实现这一点:将所有方案的“仅构建事件架构”设置为否

关于ios - 使用 ONLY_ACTIVE_ARCH = NO 在本地计算机上编译时未遇到编译警告,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35772426/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com