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

时间:2009-08-05 02:14:05

标签: objective-c naming-conventions constants

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

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

6 个答案:

答案 0 :(得分:38)

使用“k”启动常量是Mac OS X之前的遗留问题。事实上,我认为这种做法甚至可能来自当天的 way ,当时Mac OS主要是用Pascal编写的,而主要的开发语言是Pascal。在C中,#define'd常量通常用ALL CAPS编写,而不是以“k”为前缀。

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

答案 1 :(得分:9)

Current recommendations from Applenaming constants不包含'k'前缀,但是许多组织都采用了这种约定并仍在使用它,所以你仍然会看到很多。

答案 2 :(得分:8)

“k”的含义问题得到回答in this question

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

您可能对Cocoa Dev Central的C tutorial for Cocoa programmers感兴趣。它解释了许多核心概念。

答案 3 :(得分:3)

为“konvention”。认真;这只是惯例。

你可以把#define放在任何你喜欢的地方;在标题中,在顶部的.m中,在您使用它的旁边的.m中。只需将它放在任何使用它的代码之前。

随Xcode工具套件提供的“objective-c介绍”文档实际上非常好。阅读几次(我喜欢每2至5年重读一次)。

但是,我所知道的任何一本书或任何一本C书都不会回答这些特定的问题。通过经验,答案变得明显。

答案 4 :(得分:3)

k前缀来自许多开发人员喜欢在代码中使用Hungarian notation的时间。在匈牙利表示法中,每个变量都有一个前缀,告诉你它是什么类型。 pSize将是一个名为" size"的指针。而iSize将是一个名为" size"的整数。只要查看名称,就可以知道变量的类型。如果没有可以随时向您显示任何变量类型的现代IDE,这可能非常有用,否则您总是必须搜索声明才能知道它。随着时间的推移,Apple希望所有常量都有一个共同的前缀。

好的,为什么不c呢,就像c"常数"?因为c已经被采用,所以用匈牙利语表示,c用于" counter" (cApple表示"苹果计数")。 class存在类似问题,是许多语言中的关键字,那么如何命名指向类的变量呢?您会发现大量代码命名此变量klass,因此k被选中,k如" konstant"。在许多语言中,这个单词实际上以k see here开头。

关于你的第二个问题:你不应该使用#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

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

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

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

答案 5 :(得分:1)

我认为这是因为匈牙利符号的前流行,所以选择k因为c代表性格。 (http://en.wikipedia.org/wiki/Hungarian_notation

- 艾伦