【问题标题】:Pre-compile expandable macro预编译可扩展宏
【发布时间】:2011-07-04 19:38:41
【问题描述】:

我正在尝试节省一些时间/让我的代码可读。我有很多返回 BOOL 的“isXXX”消息。我不断添加更多“是”信息。是否可以通过列表制作一个在预编译时可扩展的宏。

我想指定: isMacro(1, 2, 3)。

对于其中的每一个,我希望宏将其扩展为完整的 -(BOOL)is1 {...}, -(BOOL)is2...

这似乎可以很好地利用预编译器宏扩展,但我不确定如何实现 isMacro(...) 部分。 (特别是在编译之前扩展成完整函数的 ...)。

--- 更新:

“is”方法都是动态计算的,但都是通用的。

我正在针对枚举值测试单个变量并确定它是否相等。我不能@synthesize 它们,因为它是动态的。为方便起见,我将它们全部放在@property 中。我只想要像@synthesize 这样的东西,我可以在其中列出所有这些,并为每个 isXXX 方法创建一个动态响应。

另外,我不想运行 isCheck:(opMode)mode,因为没有预编译检查来确保它是一个有效的枚举值。

所有的 is 函数都采用以下格式:
-(BOOL) isTurtle { return operationMode == Turtle; } 关键是为了简单起见,我希望它充当属性。因此,我不想要 is:(opMode)mode 之类的东西,我必须在其中指定 BOOL res = [obj is:Tutle];

【问题讨论】:

  • 这适用于 C++、Objective-C 还是 C?您已在此处标记了所有三种语言。
  • 你真正想做什么? -(BOOL)is1 {...}, -(BOOL)is2... 不是有效的 C 代码,那么为什么需要一个计算结果的宏?
  • @David:实际上,您使用的是 Objective-C。如果您使用一种语言工作,请标记该语言。不要标记其他语言,因为您猜测它可能适用于它们。
  • 你想要完成的事情根本不清楚。请展开。您正在测试的项目是什么?为什么你有这么多类似的测试?请至少发布其中一种方法作为示例。
  • 是的,认真的。这个问题被标记为“c”,我对 C 了解很多,但事实证明这是一个关于目标 C 的问题解释得不好,所以我浪费时间看这个。

标签: objective-c xcode macros


【解决方案1】:

如果您可以使用Boost.Preprocessor,则BOOST_PP_REPEAT_FROM_TO 宏应该适合您的需要。

#include <boost/preprocessor/repetition/repeat_from_to.hpp>

#define IS_METHODS(depth, n, aux) -(BOOL)is ## n { return aux == n; } 

@implementation Foo
BOOST_PP_REPEAT_FROM_TO(1, 31, IS_METHODS, operationMode)
@end

如果你做不到,那你就不走运了。实现 BOOST_PP_REPEAT_FROM_TO 与直接编写 30 多个函数的工作量大致相同。

我也看不出[obj isMode:12] 真的比obj.is12 差多少。前者还允许变量模式,并且对其他程序员来说不那么神秘(想想维护工作)。

【讨论】:

  • @David:你可以使用 Boost 吗? (准确地说是Boost.Preprocessor。)
  • 不能。但你是正确的。我正在寻找 Boost 的“本地迭代”功能。
猜你喜欢
  • 1970-01-01
  • 2017-08-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多