目标C – 为什么常量以k开始
为什么我见过的所有例子中的常量总是以k开始? 我应该在#头文件或.m文件中定义常量吗?
我是新来的目标C,我不知道C.是否有一些教程在某些地方解释这些事情,而不假设知识的C?
使用“k”开始常量是Mac OS X之前的一个传统。 事实上,我认为这种做法甚至有可能来自当天,Mac OS主要是用Pascal编写的,主要的开发语言是Pascal。 在C中,# #define
的d常量通常写在所有的CAPS中,而不是用“k”作为前缀。
至于在哪里定义常量:#定义他们在哪里使用它们。 如果您希望#import
您的代码的人使用这些常量,请将它们放在头文件中; 如果常量只在内部使用,则将它们放在.m
文件中。
目前苹果公司提供的用于命名常量的 build议不包括'k'前缀,但是许多组织采用了这个约定并仍然使用它,所以你仍然会看到它。
这个问题回答了“k”的意思。
如果您打算使用.m
以外的文件来使用这些常量,则必须将常量放在标题中,因为它们无法导入.m
文件。
你可能会对cocoa开发中心的cocoa程序员C教程感兴趣。 它解释了很多核心概念。
k为“konvention”。 认真; 这只是惯例。
你可以在任何你喜欢的地方放一个#define; 在标题中,在顶部的.m中,在您使用它的位置旁边的.m中。 只要把它放在任何使用它的代码之前。
Xcode工具套件提供的“intro-objective-c”文档实际上相当不错。 多读几遍(我喜欢每2到5年重读一次)。
但是,我不知道的C书也不会回答这些特定的问题。 这些答案通过经验变得明显。
我相信这是因为匈牙利语法的stream行,所以selectk是因为c代表字符。 ( http://en.wikipedia.org/wiki/Hungarian_notation )
–Alan
k
前缀来自许多开发人员喜欢在代码中使用匈牙利符号的时间。 在匈牙利语中,每个variables都有一个前缀,告诉你它是什么types的。 pSize
是一个名为“size”的指针,而iSize
是一个名为“size”的整数。 只是看名字,你知道一个variables的types。 这在没有现代IDE的情况下非常有用,它可以随时显示任何variables的types,否则你总是需要search声明来了解它。 随着时间的推移,苹果希望所有常量都有一个共同的前缀。
好吧,为什么不c
那么像c
为“常量”? 由于c
已被采用,匈牙利符号c
是“反”( cApple
是指“苹果计数”)。 这个class
有一个类似的问题,在许多语言中是一个关键字,那么如何命名一个指向类的variables呢? 你会发现大量的代码命名这个variablesklass
,因此k
被选中, k
如“konstant”。 在很多语言中,这个词实际上是以ak开头的, 请看这里 。
关于你的第二个问题:你不应该使用#define
来保持常量,因为#define
是无types的。
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
什么types是FOO? 这是一些数字。 但是什么样的号码? 到目前为止,任何types或没有types。 types将取决于您在代码中如何以及在何处使用FOO
。
另外,如果你有一个固定的数字集合,那么使用一个enum
,那么编译器可以validation你使用的是一个有效的值,枚举值总是不变的。
如果您必须使用定义,则定义它的位置并不重要。 头文件是您在多个代码文件中共享的文件,因此如果您需要多个位置的相同定义,则可以将其写入头文件,并将头文件包含在需要定义的任何位置。 除了非静态函数和默认全局可见的Obj-C类之外,您在代码文件中写入的内容仅在该代码文件中可见。 但是,除非在头文件中声明了一个函数,并且头文件被包含在要使用该函数的代码文件中,否则编译器将不知道该函数的外观(它期望的参数,返回的结果值) ,所以它不能检查任何这一点,必须依靠你正确地调用它(通常这会导致它创build一个警告)。 Obj-C类完全不能使用,除非你告诉当前的代码文件,至less这个名字是一个类的名字,但是如果你想实际上对这个类做些什么(除了传递它)之外,编译器需要知道类的接口,这就是接口进入头文件的原因(如果这个类只在当前的代码文件中使用,将接口和实现写入文件是合法的,并且也可以)。