美文网首页iOS开发
宏定义使用注意

宏定义使用注意

作者: 高思阳 | 来源:发表于2019-07-16 14:50 被阅读0次

http://noteton.com/u/iOS%E7%A8%8B%E5%BA%8F%E7%8A%AD%E8%A2%81/848/coding-standards-define-the-constant-shortcomings

本节着重对比了常量的定义形式,类型常量和#define的区别、各自的特点。最后得出,我们应该用带有类型的常量,而不是#define。

一个简单的示例

应用中,少不了各种动画,也就少不了设定动画的时间长度,一般来说,我们会设定短、中、长几种时间常量,用于不同的场合,了解C语言的童鞋估计对 #define 宏定义不陌生,于是,可能就会如下这么定义:

#define ANIMATION_DURATION_SHORT 0.3
#define ANIMATION_DURATION_MIDDLE 0.6
#define ANIMATION_DURATION_LONG 1.0

于是,所有用到动画时长的地方,直接用这几个宏定义就行了。

乍一看,似乎没什么问题。

类型+不可变

先来看看宏定义干了什么。
总的来说,#define 就是“替换”,在编译时,将一切宏定义替换成定义后面的内容。(参考百度百科

关键在于:

  • 宏定义不会检查替换的类型,只要遇到,就做替换
  • 宏定义不保证不可变,因为可以重复定义,不能保证值不变。(这个我觉得是最容易让人忽略的地方)

所以,用宏定义定义常量,很“危险”。

正确的做法

恰当的常量,应该具备合适的常量名字、正确的类型,还有const、extern等关键字的修饰,当然,还要根据常量适用的“范围”,做出恰当的处理。一下举例说明。

只在函数中用的常量

只在函数中用的常量:

-  (void)runAnimation {
 //动画时间长度常量
 static  const  NSTimeInterval kAnimationDurationLong =  1.0f;
 //...
}

staticconst 定义了它是静态不可变的;NSTimeInterval 则精确指定了常量的类型。

只在一个“.m”文件中使用的常量

在类的实现文件“xxx.m”文件中定义常量,也是很常见的。

你可能会觉得,既然是一个类使用的,那就放在类的头文件里面定义不就好了。

但是这么想是错的=。=

因为所有要用到这个类的文件,都会无形当中包含了这些常量声明,将不必要的数据暴露在外面,这样是违反设计原则的,并且,如果常量名字取得不恰当,还有可能造成冲突。

所以,应该如下:

//XXX.m

//必须要static
static  const  NSTimeInterval kAnimationDurationLong =  1.0f;

@implementation  XXX
//...
@end

需要注意的点:

  • 一定要放在.m文件中。
  • 必须是static,表示此常量作用域只在此.m文件中。如果不加static的话,常量就会在全局作用域中声明,可能会导致跟其他的常量冲突。
  • const,当然。
  • NSTimeInterval,确定的类型。
  • kAnimationDurationLong,“k”开头的命名,也算是Apple的规范了吧,内部常量统一以“k”开头。
全局常量

一般来说,最常见的全局常量就是发广播Notification时用的Notification的名字,往往都是一些字符串,下面就以这个为例子:

假设我们的类叫 TTGClass,我们的类会向外发送Notification,所以需要定义一个Notification的名字常量供外界注册,如下:

//TTGClass.h
extern  NSString  *  const  TTGClassWorkBeginNotification;

//TTGClass.m
NSString  *  const  TTGClassWorkBeginNotification  =  @"TTGClassWorkBeginNotification";

关键:

  • 头文件中只是做声明,不做定义。所以用extern表示常量在别处定义的,尽量隐藏细节。
  • 同类名做常量名字的开头,这个非常关键,因为Objective-C里面没有像Java那样的 “包” 机制,所以必须靠命名来划分不同的类,常量当然也要遵循这个规则。
  • NSString,确定的类型;const,表明常量;Notification后缀,表明用途。这些都是需要注意的。
总结

良好的代码,总是少不了定义各种常量,以避免“魔鬼数字、魔鬼字符串”。所以我们应该尽量避免少用#define定义常量,而是用带有类型的、const的常量,并且尽可能的缩小常量的作用域。

相关文章

  • 宏定义使用注意

    http://noteton.com/u/iOS%E7%A8%8B%E5%BA%8F%E7%8A%AD%E8%A2...

  • C语言特性(预处理)

    预处理 使用#define、#undef执行宏定义 #define的作用就是为字符串起个名字关于宏定义,有如下注意...

  • iOS 开发之纯代码写 UI 相关的点点滴滴

    Write One,Run Everywhere 之 RuntimeSize( ) 没错这是宏定义 使用方法 注意...

  • 宏定义注意事项

    宏定义 为一段代码定义一个标识, 在编译之前将使用宏名的地方替换为宏值,这个替换的过程叫宏替换也叫宏代换 注意: ...

  • 各种宏、声明的作用

    声明 typedef 宏 使用以下3个宏的注意点 :这几个宏定义只是决定代码块是否被编译! :别忘了#endif ...

  • 准备:回顾c

    宏定义 关键字 define 定义一个常量的方法(即宏定义) 带参数的宏定义 宏函数的定义 使用宏函数的好处是,不...

  • C语言学习笔记-宏定义的使用注意事项

    在使用宏定义的时候有一些注意事项 必须注意,要适当的使用圆括号以保证计算次序的正确性。 比如: 当使用 squar...

  • iOS宏定义介绍

    宏定义 在了解宏定义的使用前,需要说明一下合理使用宏定义确实可以提高程序的可读性,但是滥用宏定义,也会带来一些害处...

  • iOS UIColor 16进制转换

    宏定义如下: 使用:

  • C语言中的预处理器(二)

    预定义宏 ANSI C 定义了许多宏。在编程中您可以使用这些宏,但是不能直接修改这些预定义的宏。简而言之,预定义宏...

网友评论

    本文标题:宏定义使用注意

    本文链接:https://www.haomeiwen.com/subject/qpqtlctx.html