如何禁用 XCode 编译器在 Objective-C 源代码文件中定义“-DXXX”
Posted
技术标签:
【中文标题】如何禁用 XCode 编译器在 Objective-C 源代码文件中定义“-DXXX”【英文标题】:How to disable XCode compiler defines "-DXXX" in the Objective-C source code files 【发布时间】:2017-01-08 02:44:21 【问题描述】:尝试使用 NS_BLOCK_ASSERTIONS #undef,但看起来设置中的 Release 默认选项被粗暴地焊接到构建过程中。诀窍是只使用 .m 源代码文件指令(可能是编译指示)来禁用它,因为我处于无法控制 XCode 项目设置的情况,并且它们在发布版本中被设置为我的默认设置。
#undef NS_BLOCK_ASSERTIONS
#import <Foundation/Foundation.h>
#include <stdio.h>
@interface LoggingAssertionHandler : NSAssertionHandler
@end
@implementation LoggingAssertionHandler
- (void)handleFailureInMethod:(SEL)selector
object:(id)object
file:(NSString *)fileName
lineNumber:(NSInteger)line
description:(NSString *)format, ...
NSString *failureMessageDescription = [NSString stringWithFormat:@"NSAssert Failure: Method %@ for object %@ in %@#%li. Reason: \"%@\"", NSStringFromSelector(selector), object, fileName, (long)line, format];
printf("%s\n", [failureMessageDescription UTF8String]);
- (void)handleFailureInFunction:(NSString *)functionName
file:(NSString *)fileName
lineNumber:(NSInteger)line
description:(NSString *)format, ...
NSString *failureMessageDescription = [NSString stringWithFormat:@"NSCAssert Failure: Function (%@) in %@#%li. Reason: \"%@\"", functionName, fileName, (long)line, format];
printf("%s\n", [failureMessageDescription UTF8String]);
@end
int main(int argc, const char * argv[])
@autoreleasepool
NSAssertionHandler *assertionHandler = [[LoggingAssertionHandler alloc] init];
[[[NSThread currentThread] threadDictionary] setValue:assertionHandler forKey:NSAssertionHandlerKey];
NSCAssert(true == false, @"Impossible.");
NSLog(@"Hello, World!");
return 0;
【问题讨论】:
我使用的 XCode 版本是 8.2.1。 您能否详细说明 Xcode 项目设置的细节超出您的能力范围?您是否不允许触摸目标的项目设置?你不能设置 Xcode 配置文件吗?这方面的信息将有助于为您提供更好的答案。 【参考方案1】:问题在于宏是在项目创建时添加的系统文件的一部分,这些文件是预编译(预预处理)的。您的#undef
是稍后编译的,因此它无法更改已经预处理的宏。
要改变这一点,请将#undef
放在.pch(预编译头文件)文件中,放在系统头文件的包含之前。它可能看起来像这样:
#ifdef __OBJC__
#undef NS_BLOCK_ASSERTIONS
#import <Cocoa/Cocoa.h>
#endif
【讨论】:
谢谢。我也是这么想的,在我遇到一个测验之前:在最新的 XCode 中为 Objective-C 选择单个文件 (main.m) 命令行应用程序模板时,我在哪里可以找到 XCode 项目浏览器中的 .pch 文件版本?谢谢。以上是关于如何禁用 XCode 编译器在 Objective-C 源代码文件中定义“-DXXX”的主要内容,如果未能解决你的问题,请参考以下文章
如何让 XCode 构建一个包含 Objective-C++ 的项目?