为什么当我对 int 使用 #define 时需要将它们括在括号中?

Why when I use #define for int I need to wrap them in brackets?

这是我找到的示例:

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

为什么不能那样呢?

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

而前面的k是什么意思?有相关的指南吗?

k 只是一个匈牙利符号约定,表示它是一个常量值。我个人认为这很愚蠢,但这是许多人遵循的惯例。代码根本不需要工作。

我不确定为什么您看到的示例周围有括号,但不需要在#define 值周围加上括号。

在你的例子中并不是真正需要的,但是在定义中使用括号是一种有用的方法,可以确保你的定义在定义的上下文中准确说明你的意思,并在使用时保护它免受副作用代码。

#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

#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)

至于命名约定,AFAIK #define 常量使用带下划线的大写字母,const 常量使用带前导 k 的驼峰名称。