【问题标题】:What's the difference between #if and #ifdef Objective-C preprocessor macro?#if 和 #ifdef Objective-C 预处理器宏有什么区别?
【发布时间】:2012-09-28 17:41:22
【问题描述】:

如何在构建设置中定义预处理器宏,例如 IPAD_BUILD 和 IPHONE_BUILD(以及如何在我的工厂方法中使用它们)?

我现在正在使用这些,如果知道后面发生了什么会很酷。

【问题讨论】:

    标签: ios objective-c macros c-preprocessor conditional-compilation


    【解决方案1】:

    /#if 照常工作,如果:

    #if __IPHONE_OS_VERSION_MAX_ALLOWED >= 30200
      if (UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad) {
        return YES;
      }
    #endif
      return NO;
    }
    

    /#ifdef 表示“如果已定义 - 某些值或宏”:

    #ifdef    RKL_APPEND_TO_ICU_FUNCTIONS
    #define RKL_ICU_FUNCTION_APPEND(x) _RKL_CONCAT(x, RKL_APPEND_TO_ICU_FUNCTIONS)
    #else  // RKL_APPEND_TO_ICU_FUNCTIONS
    #define RKL_ICU_FUNCTION_APPEND(x) x
    #endif // RKL_APPEND_TO_ICU_FUNCTIONS
    

    或:

    #ifdef __OBJC__
        #import <Foundation/Foundation.h>
    #endif
    

    使用此链接了解更多信息 http://www.techotopia.com/index.php/Using_Objective-C_Preprocessor_Directives

    要测试你是否运行 iPad,你应该有这样的东西:

    #define USING_IPAD UI_USER_INTERFACE_IDIOM() == UIUserInterfaceIdiomPad
    
    if (USING_IPAD) {
        NSLog(@"running iPad");
    }
    

    这是另一个有用的预处理器函数:

    #ifdef DEBUG
        //here we run application through xcode (either simulator or device). You usually place some test code here (e.g. hardcoded login-passwords)
    #else
        //this is a real application downloaded from appStore
    #endif
    

    【讨论】:

    • 谢谢。可以肯定的是:#define IPAD_BUILD 是否足以被定义(没有任何值?)在这种情况下 #ifdef IPAD_BUILD 会返回 true 吗?
    • 实际上没有 = ) 我会改变答案。
    【解决方案2】:

    宏可以是未定义的,它可以被定义为没有值,或者它可以被定义为某个值,可能是一个数字。示例:

    #undef MACRO
    #define MACRO
    #define MACRO ??????
    #define MACRO 0
    #define MACRO 1
    

    #ifdef MACRO 或#if defined (MACRO) 检查宏是否已定义,有或无值。

    #if MACRO 替代宏定义;如果未定义宏,则将其替换为 0。然后计算它找到的表达式。如果我们用上面的五个例子,#if MACRO 就会变成

    #if 0
    #if
    #if ??????
    #if 0
    #if 1
    

    数字 2 和 3 给出编译时错误。数字 1 和 4 评估为 false,因此跳过以下代码。数字 5 评估为真。

    #if 更灵活:你可以写

    #if MACRO == 2
    

    如果宏被定义为例如,它将只编译以下代码

    #define MACRO 2
    

    【讨论】:

      猜你喜欢
      • 2023-03-12
      • 2011-04-17
      • 2017-04-19
      • 1970-01-01
      • 1970-01-01
      • 2011-05-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多