【问题标题】:Using #define, good practice?使用#define,好的做法?
【发布时间】:2014-03-13 11:16:58
【问题描述】:

为了清理我的代码,将#define 用于多行代码是否是一种好习惯?大多数示例是几行,定义尺寸等。
在我的示例中,我有以下代码的单独头文件。以这种方式使用#define 是一种好习惯吗?

#define KCHECKREFERENCE if([self.partClasses containsObject:@"Part1"]||[self.partClasses containsObject:@"Part2"]||[self.partClasses containsObject:@"Part3"]||[self.partClasses containsObject:@"Part4"]||[self.partClasses containsObject:@"Part5"]||[self.partClasses containsObject:@"Part6"]||[self.partClasses containsObject:@"ICDomesticEICPart7"]||[self.partClasses containsObject:@"ICDomesticEICPart8"] ){\
[self.currentPartView save];\
self.previousPartView = self.currentPartView;\
int nextPartNumber = 1;\
ICCertificateComponent *part = [self loadPart:nextPartNumber];\
self.currentPartView = part;\
CGRect nextPartViewFrame = self.currentPartView.view.frame;\
nextPartViewFrame.origin.x = 320.0f;\
self.currentPartView.view.frame = nextPartViewFrame;\
CGRect previousPartViewFrame = self.previousPartView.view.frame;\
previousPartViewFrame.origin.x = -320.0f;\
nextPartViewFrame.origin.x = 0;\
[self.view insertSubview:self.currentPartView.view belowSubview:self.navBarView];\
NSTimeInterval duration = 0.1;\
[UIView animateWithDuration:duration\
                 animations:^{\
                     self.previousPartView.view.frame = previousPartViewFrame;\
                     self.currentPartView.view.frame = nextPartViewFrame;\
                 }\
                 completion:^(BOOL finished) {\
                     self.currentPartNumber = 1;\
                     self.navBarView.prevButton.enabled = NO;\
                    self.navBarView.nextButton.enabled = YES;\
                     [self.previousPartView.view removeFromSuperview];\
                     self.previousPartView = nil;\
                     if (self.currentPartView.showsShareOptions == YES) {\
                         self.navigationItem.leftBarButtonItem = [[UIBarButtonItem alloc] initWithTitle:@"Share" style:UIBarButtonItemStyleBordered target:self action:@selector(shareButtonPressed:)];\
                     }\
                 }\
 ];\

【问题讨论】:

标签: ios objective-c macros


【解决方案1】:

没有。尤其是对于如此具体的事情。

而不是#define,把这段代码放在一个方法中。

【讨论】:

  • 如果这段代码更小,并且您需要将其内联以快速运行,您可能不想将其放入方法中。鉴于大小,调用方法的开销非常小。
  • 这可能是真的,但这里肯定不是这样。此外,这是一个代码清洁问题,而不是优化问题。
  • @AnthonyLambert 正如@nhgrif1 所写,事实并非如此。也不要试图变得如此聪明,LLVM 在优化你的东西时会更聪明。可读性也很糟糕,调试也很糟糕,......这是一团糟......如果你需要内联,为什么不使用inline C函数,它可以从你的ObjC方法中调用。
  • 这会告诉你你想知道的一切:en.wikipedia.org/wiki/Inline_function
  • @Robert-Vojta 看看我开始编程时你必须聪明!
【解决方案2】:

我知道定义是很好的做法的几个案例。比如_countof

#if !defined(_countof)
#if !defined(__cplusplus)
#define _countof(_Array) (sizeof(_Array) / sizeof(0[_Array]))
#else
template <typename _CountofType, size_t _SizeOfArray>
char (*__countof_helper(_CountofType (&_Array)[_SizeOfArray]))[_SizeOfArray];
#define _countof(_Array) sizeof(*__countof_helper(_Array))
#endif
#endif

但是你的 KCHECKREFERENCE 是邪恶的。您应该改用 inline 函数。为什么?至少因为你不能在你的宏里面设置断点。

【讨论】:

    猜你喜欢
    • 2018-08-11
    • 1970-01-01
    • 2011-07-22
    • 2012-04-04
    • 2011-04-17
    • 1970-01-01
    • 1970-01-01
    • 2013-07-24
    • 1970-01-01
    相关资源
    最近更新 更多