【问题标题】:Complex preprocessor macro复杂的预处理器宏
【发布时间】:2014-03-04 16:18:21
【问题描述】:

我正在创建一个UIColor 类别,其中有一组我想轻松访问然后缓存的颜色。

这基本上是我创建颜色的方式:

#define RGB(r, g, b) [self colorWithRed:(r)/255.0 green:(g)/255.0 blue:(b)/255.0 alpha:1]

// [..]

+ (instancetype)pigletColor
{
    static UIColor *pigletColor = nil;
    if (!pigletColor) {
        pigletColor = RGB(237.0, 0.0, 130.0);
    }
    return pigletColor;
}

但是,重复上述十次并不是很干净,所以我正在尝试创建一个宏来让我轻松地做到这一点。

理想情况下,我想用COLORGETTER(piglet, 234.0, 0.0, 130.0) 替换上面的内容。我已经尝试过了,但我无法让它工作。这是我得到的:

#define COLORGETTER(name, red, green, blue)\
+ (instancetype *)##name##Color\
{\
    static UIColor *##name##Color = nil;\
    if (!##name##Color) {\
        ##name##Color = RGB(red, green, blue);\
    }\
    return ##name##Color;\
}

但是,上述方法不起作用,因为我无法弄清楚 #/## 运算符。

有什么想法吗?

【问题讨论】:

    标签: objective-c macros c-preprocessor


    【解决方案1】:

    有两个错误:

    • (instancetype *) 应该是 (instancetype)。类似于id,这已经是一个指针了。
    • ##name##Color 应该是 name##Color。您想连接名称和“颜色” 到单个标记,但不是前面的标记。

    所以这似乎有效:

    #define COLORGETTER(name, red, green, blue)\
        + (instancetype) name##Color\
        {\
            static UIColor * name##Color = nil;\
            if (!name##Color)\
            {\
                name##Color = RGB(red, green, blue);\
            }\
            return name##Color;\
        }
    

    【讨论】:

    • 不错的一个!在此之后我的提交包括37 additions and 223 deletions.。谢谢!有 24 个颜色吸气剂,我可以简化。 :)
    【解决方案2】:

    一些事情

    1. instancetype 已经是一个指针,不要使用instancetype *
    2. 您只需要##介于 标识符 - name ## Color,而不是 ## name ## Color
    3. 您确实应该使用dispatch_once 块而不是if
    4. 可选,但您并不需要本地人的自定义名称。只使用一个名字更容易。
    #define COLORGETTER(name, red, green, blue)\
    + (UIColor *)name##Color\
    {\
        static UIColor *color = nil;\
        static dispatch_once_t onceToken;\
        dispatch_once(&onceToken, ^{\
            color = RGB(red, green, blue);\
        });\
        return color;\    
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-04-15
      • 2015-07-31
      • 2010-09-19
      • 2020-02-09
      • 1970-01-01
      相关资源
      最近更新 更多