为什么我见过的所有例子中的常量总是以k开头?我应该在header或.m文件中#define常量吗?
我是Objective C的新手,我不知道C.是否有某些教程可以在不知道C的情况下解释这些事情?
答案 0 :(得分:38)
使用“k”启动常量是Mac OS X之前的遗留问题。事实上,我认为这种做法甚至可能来自当天的 way ,当时Mac OS主要是用Pascal编写的,而主要的开发语言是Pascal。在C中,#define
'd常量通常用ALL CAPS编写,而不是以“k”为前缀。
至于#define
常数的位置:#define
它们将在哪里使用它们。如果您希望#import
代码的人使用常量,请将它们放在头文件中;如果常量仅在内部使用,请将它们放在.m
文件中。
答案 1 :(得分:9)
答案 2 :(得分:8)
“k”的含义问题得到回答in this question。
如果您打算使用特定.m
以外的文件来使用这些常量,则必须将常量放在标头中,因为它们无法导入.m
文件。
您可能对Cocoa Dev Central的C tutorial for Cocoa programmers感兴趣。它解释了许多核心概念。
答案 3 :(得分:3)
你可以把#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)
- 艾伦