【问题标题】:Objective-C how to define macro based on string comparison resultObjective-C如何根据字符串比较结果定义宏
【发布时间】:2014-10-01 13:32:21
【问题描述】:

我想根据字符串比较结果定义一个宏。我尝试的方法不起作用。

#define APP_BUNDLE_IDENTIFIER    [[NSBundle mainBundle] bundleIdentifier]
#define APP_EXTENSION_BUNDLE_IDENTIFIER  @"abcded"
#define RESULT strcmp(APP_BUNDLE_IDENTIFIER, APP_EXTENSION_BUNDLE_IDENTIFIER)
#if $RESULT == 1
        #define TARGET_IS_EXTENSION
#endif

基本上,我试图根据定义的宏来实现我的应用程序将区分原生应用程序和应用程序扩展。

【问题讨论】:

  • 请记住,预处理器会进行字符串替换,而不是函数求值。
  • 好的,那么实现它的最佳方法是什么?
  • @loganathan 很简单,停止使用宏,使用普通的常量/函数/方法。

标签: ios objective-c c-preprocessor


【解决方案1】:

这段代码的根本问题是#define#if 在代码编译时被评估,而Objective-C 方法调用和像strcmp 这样的C 函数在代码执行时被评估。这意味着您不能以这种方式有条件地#define,因为代码要到稍后才会执行。

第二个问题是您不能将strcmpNSString 一起使用。您需要使用NSString 方法。

可能可以构造一个宏来进行所需的比较,但使用 C 函数会更简单。

【讨论】:

  • 即使使用 NSString 比较,结果也总是为零,因为我没有得到正确的结果。我可以使用 C 函数,但这在运行时是可能的。我想在编译时获得结果。那样的话我的问题就很容易解决了。
  • 编译时无法得到这个结果。您可以做的最好的事情是创建一个宏,该宏将包含在运行时执行并返回结果的代码。如果您想在编译时使用TARGET_IS_EXTENSION,那么您只需在扩展编译器标志或头文件中使用#define
  • 实际上我不能使用宏“TARGET_IS_EXTENSION”,原因是我的共享嵌入式框架中有我所有的通用代码。由于该包 ID 与应用包 ID 和应用扩展包 ID 不同。此外,我的头文件也由应用程序和应用程序扩展共享。由于我无法以这种方式定义宏
  • 您可以在 Xcode 中,在扩展目标的编译器标志中定义宏。然后它将仅存在于扩展中。它不必在头文件中。但是你不能在编译时使用 Objective-C 来检查 bundle ID。
  • 您的意思是在其他 C 标志部分下的自定义编译器标志下?请确认。
【解决方案2】:
#if RESULT

肯定不是 $,看看其余的就很混乱。 #define 只是进行字符串替换,所以 RESULT 将成为 strcmp,这没有意义,因为 strcmp 是运行时函数而不是预处理器函数,所以你怎么能有 #if strcmp .....

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-02-05
    • 1970-01-01
    • 1970-01-01
    • 2010-10-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多