objective-c - 复杂的预处理器宏

标签 objective-c macros c-preprocessor

我正在创建一个 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;\
}

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

有什么想法吗?

最佳答案

有两个错误:

  • (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;\
    }

关于objective-c - 复杂的预处理器宏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22177274/

相关文章:

iphone - Objective-C 十进制到 Base 16 十六进制转换

c++ - 宏 C++ 问题 __VA_ARGS__

c++ - 宏重新定义警告

c# - 有人如何在 C# 中编写 "macro"?

c - 在 C 中禁用返回

编译器需要在第一列添加 # 吗?

c - 编译时出错 : expected expression before ')' token

ios - 如何在 iOS 上调配类方法?

iphone - 无法获取图片的 [ALAsset 缩略图],但适用于视频

iphone - 检测以编程方式创建的控件中的 iOS UI 事件