【问题标题】:Why when I use #define for int I need to wrap them in brackets?为什么当我使用 #define for int 时,我需要将它们括在括号中?
【发布时间】:2015-03-01 14:20:48
【问题描述】:

这是我找到的示例:

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

为什么不能这样?

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

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

【问题讨论】:

  • k 只是表示该值是常量/文字的约定。 “简单”值通常不需要()(我相信有人会提出例外),但如果您有诸如1<<3 之类的表达式,则强烈建议您使用,否则表达式可能会上升反对首先关联并产生“不可预测的结果”的事物。
  • 我同意使用首字母 k 是一种约定,但是当常量引用 key 时我通常会看到它(这就是我相信 k 的来源)。常规常量的约定是将它们写成大写?!我知道这些都是“公正”的约定,但是这种区别给了它更多的上下文,我个人喜欢它。 @HotLicks
  • 这也意味着以k 开头的常量是不同的,大写常量不一定是这种情况。
  • (1) 你不应该使用“k ...”作为预处理宏,不要那样做。 (2) 对此类宏使用 ALLCAPS。 (3) 你需要大括号的原因是微不足道的,以避免 Rory 解释的“扩张困境”。
  • @JoeBlow - 最后一次统计,常量和文字有 3.14159268 x 10**34 种不同的命名约定。说使用 k 是错误的而 ALLCAPS 是正确的,是武断地选择其中一种约定而不是其他约定。

标签: ios objective-c c-preprocessor


【解决方案1】:

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

例如

#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

【讨论】:

    【解决方案2】:
    #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 for #define 常量使用带有下划线的大写字母,const 常量使用带有 k 前导的驼峰名称。

    【讨论】:

      【解决方案3】:

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

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

      【讨论】:

      • 当值是表达式而不是简单值时,肯定需要括号。一直这样做并不是一个坏习惯。
      • 我不确定我是否会过度使用非常复杂的表达式来滥用#define。由于它是一个宏,因此通常应仅限于更简单的用途。
      • 即使在 Apple 的代码中也很常见,例如 #define kSomeConst (1 << 4)。使用#define 来创建一些经常使用的凌乱表达的简洁版本也是相当普遍的。
      • 好吧,公平的那种表达好吧。但实际上你在定义一个不变的值,你不能在没有表达式的情况下定义它。而且,如果你有很多这样的人,我可以看到只是养成习惯。
      • 你在说什么鬼?我同意他的看法。停止拖钓。
      猜你喜欢
      • 1970-01-01
      • 2018-10-26
      • 1970-01-01
      • 2017-11-07
      • 1970-01-01
      • 1970-01-01
      • 2014-06-20
      • 2014-08-09
      • 2021-05-23
      相关资源
      最近更新 更多