#ifdef DEBUG与#if DEBUG

lid*_*ker 50 xcode objective-c ios

在使用编译器指令时,我不清楚以下两个代码片段中哪些是正确/首选的,为什么.似乎我见过的大多数开发人员和开源项目都使用了第一个,但我也看到了第二个经常使用的项目.

#ifdef DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
Run Code Online (Sandbox Code Playgroud)

#if DEBUG
[self doSomethingOnlyWhenDebugging];
#endif
Run Code Online (Sandbox Code Playgroud)

以上哪个代码片段最适合在调试时运行代码,为什么?我的猜测是,如果将DEBUG定义为TRUE或FALSE,则第一个将运行,其中第二个将仅在定义DEBUG并设置为TRUE时运行.那是对的吗?

Jef*_*ley 39

你是对的.#if DEBUG不会评估是否DEBUG定义为0.

至于何时使用每个,如果存在预处理器定义,您可以坚持使用#ifdef只需要添加代码的任何内容,例如添加调试日志记录.如果你需要检查值并沿着不同的编译路径,那么我会使用01.一个很好的例子是TARGET_IPHONE_SIMULATOR,它总是为iOS项目定义,但前提1是你正在为模拟器进行编译.

  • 因此,如果我只想在模拟器中执行某些代码行,我需要使用`#if`,因为无论我是否在模拟器上运行,都会定义`TARGET_IPHONE_SIMULATOR`.正确? (2认同)

Daw*_*ong 7

据我所知,最好的选择是:

#ifndef DEBUG
    NSLog(@"-1");
#elif DEBUG == 0
    NSLog(@"0");
#else
    NSLog(@"%d", DEBUG);
#endif
Run Code Online (Sandbox Code Playgroud)

那么,你会知道#ifndef DEBUG比其他所有人更受欢迎.有一个更简单的选择:

#if DEBUG == 0 // DEBUG is not defined or defined to be 0
    // do sth
#else
    // do sth
#endif
Run Code Online (Sandbox Code Playgroud)

但是,如果-Wundef编译器标志是,有可能是一个警告,#if DEBUG == 0.