这是我发现的例子:
#define kNumberOfViews (37)
#define kViewsWide (5)
#define kViewMargin (2.0)
为什么不能那样?
#define kNumberOfViews 37
#define kViewsWide 5
#define kViewMargin 2.0
前面的k
是什么意思?有没有一些指南呢?
答案 0 :(得分:3)
在您的示例中并不是真的需要,但在定义中使用括号是一种有用的方法,可确保您的定义在定义的上下文中准确说明您的意思,并在代码中使用时保护它免受副作用的影响。
E.g
#define VAR1 40
#define VAR2 20
#define SAVETYPING1 VAR1-VAR2
#define SAVETYPING2 (VAR1-VAR2)
然后在你的代码中
foo(4*SAVETYPING1); // comes out as foo(140)
与
不一样foo(4*SAVETYPING2); // comes out as foo(80)
至于k前缀的含义。它用于常量。这里有很多关于起源的讨论:
答案 1 :(得分:1)
#define SOME_VALUE 1234
它是预处理程序指令。这意味着,在编译代码之前,SOME_VALUE
的所有实例都将替换为1234
。替代方案是
const int kSomeValue = 1234;
关于其中一个或另一个的优点的讨论 #define vs const in Objective-C
至于括号 - 在更复杂的情况下,它们是必要的,因为预处理器使用#define
进行复制粘贴。考虑这个例子:
#define BIRTH_YEAR 1990
#define CURRENT_YEAR 2015
#define AGE CURRENT_YEAR - BIRTH_YEAR
...
// later in the code
int ageInMonths = AGE * 12;
此处有人可能会ageInMonths = 25 * 12
,而是计算为ageInMonths = 2015 - 1990 * 12 = 2015 - (1990 * 12)
。这就是为什么AGE
的正确定义应该是
#define AGE (CURRENT_YEAR - BIRTH_YEAR)
对于命名约定,使用带有下划线的#define
常量大写情况的AFAIK,并使用const
常量带有前导k
的骆驼名称。
答案 2 :(得分:-2)
k只是一种匈牙利符号约定,表示这是一个常数值。就个人而言,我觉得它很愚蠢,但这是一个很多人都遵循的惯例。代码根本不需要工作。
我不确定为什么你看到的例子有围绕它们的parens,但是没有必要在#define值周围加上括号。