【问题标题】:How do you use the preprocessor to conditionally declare the superclass of a new class?如何使用预处理器有条件地声明一个新类的超类?
【发布时间】:2013-09-22 02:30:28
【问题描述】:

我有一个需要部分重写的框架,并且正在采用 AFNetworking。因此,第二版需要属于不同的超类(AFHTTPClient)。我正在尝试使用预处理器标志并有条件地声明它。

这是我的代码:

#define TLC_FRAMEWORK_VERSION 2

#if TLC_FRAMEWORK_VERSION == 1
@interface TKSession : NSObject
#elif TLC_FRAMEWORK_VERSION == 2
@interface TKSession : AFHTTPClient
#endif
{
@private
    NSMutableArray  *_cachedShifts;
}

编译器(clang)给出错误,基本上说明编译器在预处理后没有正确读取声明。它认为它看到了这个:

#define TLC_FRAMEWORK_VERSION 2

{
@private
    NSMutableArray  *_cachedShifts;
}
...

我做错了什么/错过了什么?

【问题讨论】:

  • 接口声明后缺少@end。除此之外,它应该可以工作。
  • 我有。把它从这里的代码中去掉。

标签: ios objective-c c macos oop


【解决方案1】:
#define TLC_FRAMEWORK_VERSION 2

#if TLC_FRAMEWORK_VERSION == 1
@interface TKSession : NSObject
#else
@interface TKSession : AFHTTPClient
#endif
{
@private
     NSMutableArray  *_cachedShifts;
}

但更好地定义类似的东西:

#if TLC_FRAMEWORK_VERSION == 1
typedef NSObject TLCHTTPClient;
#else
typedef AFHTTPClient TLCHTTPClient;
#endif

@interface TKSession : TLCHTTPClient
{
@private
     NSMutableArray  *_cachedShifts;
}

更容易阅读

【讨论】:

    【解决方案2】:

    好的,我会回答我自己的问题。这是一个范围问题,我使用该标志导入的标头由于某种原因没有被正确解析。我太忙了,无法处理编译器问题或异常,所以我在本地声明了标志。

    【讨论】:

    • “我太忙了,没时间处理编译器问题或异常[...]”:我强烈建议追踪这些问题并解决它们。否则你可能会遇到奇怪的、编译时产生的错误行为。通常这种问题来自循环包含依赖...
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多