目标C - 为什么常数以k开头

mk1*_*k12 42 constants objective-c naming-conventions

为什么我见过的所有例子中的常量总是以k开头?我应该在header或.m文件中#define常量吗?

我是Objective C的新手,我不知道C.是否有某些教程可以在不知道C的情况下解释这些类型的东西?

mip*_*adi 38

使用"k"启动常量是Mac OS X之前的遗留问题.其实,我觉得练习,甚至可能来自方式,早在天,当Mac OS的在帕斯卡大多写的,主要的开发语言是帕斯卡.在C中,#define'd常量通常用ALL CAPS编写,而不是用"k"加前缀.

至于#define常数的位置:#define它们将在哪里使用它们.如果您希望#import代码使用常量的人,请将它们放在头文件中; 如果常量只在内部使用,请将它们放在.m文件中.

  • `#define`基本上是一个搜索和替换; 所以,如果你#define MYCONST @"My Constant",那么在你使用`MYCONST`的任何地方都会分配一个字符串.但是,如果使用`extern NSString*const MYCONST = @"My Constant";`,字符串将只被分配一次,并且`MYCONST`的所有使用都将指向相同的字符串.对于其他`#define`'d数据类型(例如,`#define MYCONST 4.0`),它几乎没有什么区别. (8认同)
  • 有趣的是,Google Code Style Guide要求常量也以'k'开头.当讨厌匈牙利记谱法的人使用这个惯例时,我很开心.:) (7认同)

Cal*_*leb 9

Apple命名常量的当前建议不包括'k'前缀,但许多组织采用该约定并仍然使用它,因此您仍然可以看到它很多.


Chu*_*uck 8

在这个问题中回答了"k"意味着什么的问题.

如果您打算.m使用这些常量以外的文件来使用这些常量,则必须将常量放在标题中,因为它们无法导入.m文件.

您可能对Cocoa Dev Central的Cocoa程序员C教程感兴趣.它解释了许多核心概念.


Mec*_*cki 6

k前缀来自许多开发人员喜欢在代码中使用匈牙利表示法的时代。在匈牙利表示法中,每个变量都有一个前缀,告诉您它是什么类型。pSize将是一个名为“size”的指针,而iSize将是一个名为“size”的整数。只要看名字就知道变量的类型。在没有可以随时显示任何变量类型的现代 IDE 的情况下,这非常有用,否则您始终必须搜索声明才能了解它。顺应当时的趋势,Apple 希望所有常量都有一个共同的前缀。

好吧,c那为什么不呢,比如c“常数”呢?因为c已经采用了,在匈牙利符号中,c是“计数器”(cApple意思是“苹果数”)。作为许多语言中的关键字,也存在类似的问题class,那么如何命名指向类的变量呢?您会发现大量代码命名该变量klass并因此k被选择,k如“konstant”。在许多语言中,这个词实际上确实以 ak 开头,请参见此处

关于你的第二个问题:如果可以避免的话,你根本不应该使用#define常量,就像#define无类型一样。

const int x = 10;           // Type is int
const short y = 20;         // Type is short
const uint64_t z = 30;      // Type is for sure UInt64
const double d = 5000;      // Type is for sure double
const char * str = "Hello"; // Type is for sure char *

#define FOO 90
Run Code Online (Sandbox Code Playgroud)

FOO是什么类型?这是某种数字。但什么样的数字呢?到目前为止任何类型或根本没有类型。类型取决于您FOO在代码中使用的方式和位置。

此外,如果您有一组固定的数字,请使用enumas ,然后编译器可以验证您使用的是有效值,并且枚举值始终是常量。

如果必须使用定义,那么在哪里定义它并不重要。头文件是在多个代码文件之间共享的文件,因此如果您需要在多个位置使用相同的定义,请将其写入头文件中,并在需要该定义的任何位置包含该头文件。写入代码文件的内容仅在该代码文件内可见,默认情况下全局可见的非静态函数和 Obj-C 类除外。但是,除非在头文件中声明了一个函数,并且该头文件包含在您要使用该函数的代码文件中,否则编译器将不知道该函数的外观(它需要什么参数,它返回什么结果值) ,因此它无法检查其中的任何内容,并且必须依赖于您正确调用它(通常这会导致它创建警告)。Obj-C 类根本无法使用,除非您至少告诉当前代码文件该名称是一个类的名称,但如果您想实际对该类执行某些操作(而不只是传递它),则编译器需要知道类的接口,这就是接口进入头文件的原因(如果该类仅在当前代码文件中使用,则将接口和实现写入文件是合法的并且也可以工作)。