如何禁用 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++ 的项目?

xcode >= 8 无法编译我的 Objective-C 库

Objective-C Swift 桥接头

Objective-C Swift 桥接头

Xcode 8 Objective-C 类别警告

Objective-C(14)Xcode7新特性