为什么当我使用#define用于int时我需要将它们用括号括起来?

时间:2015-03-01 14:20:49

标签: ios objective-c c-preprocessor

这是我发现的例子:

#define kNumberOfViews (37)
#define kViewsWide (5)
#define kViewMargin (2.0)

为什么不能那样?

#define kNumberOfViews 37
#define kViewsWide 5
#define kViewMargin 2.0

前面的k是什么意思?有没有一些指南呢?

3 个答案:

答案 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前缀的含义。它用于常量。这里有很多关于起源的讨论:

Objective C - Why do constants start with 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值周围加上括号。