k前缀常量的命名惯例源于哪里?

54

在IT技术中,常量通常以k开头进行前缀命名(例如k_pi)。但是,这里的k到底代表什么意思呢?

是否仅仅是因为c已经代表了char而选择使用k


8
不太常见 - 我在 C++ 中从未见过它。 - jon hanson
2
在Cocoa中,它也被广泛使用。因此,至少有两家全球最大的软件公司在使用它。 - Johan Kotlinski
26
可能并不常见,但它确实很特别。 - Johan Kotlinski
3
这种风格的目的是为了辩论,这就是不使用它的好理由。提高可读性的目标是减少混淆和歧义。 - Thomas Matthews
1
我在Win32 API代码中经常看到这个。这也是我尽可能避免使用它的原因之一 :3。 - zeboidlund
显示剩余8条评论
9个回答

115

这是一个历史上的怪异现象,在那些盲目奉行自己不理解的编码标准的团队中仍然很常见。

很久以前,大多数商业编程语言都是弱类型的;我们现在认为理所当然的自动类型检查仍然主要是学术课题。这意味着编写存在类别错误的代码很容易;它可以编译和运行,但会以难以诊断的方式出错。为了减少这些错误,Simonyi建议您每个变量名都以标记开头来指示其(概念性)类型,从而更容易发现其被误用的情况。由于他是匈牙利人,所以这种做法被称为“匈牙利标记法”。

后来,随着类型化语言(特别是C语言)的普及,一些白痴听说这是个好主意,但不理解它的目的。他们提议对每个变量添加冗余标记,以指示其声明的类型。它们的唯一用途是使检查变量类型更容易;除非有人更改了类型并忘记更新标记,在这种情况下,它们会起到积极的有害作用。

第二种(无用的)形式更容易描述和执行,因此它被许多团队盲目采用;几十年后,您仍然会偶尔看到它被使用甚至受到提倡。

“c”是类型“char”的标记,因此它不能用于“const”;因此选择了“k”,因为它是德语中“konstant”的第一个字母,在数学中广泛用于常量。


22
如果您删除主观和争议性的部分,我可以接受这个答案。 - Johan Kotlinski
3
你能提供这个故事的参考资料吗?这并不是我所知道的故事。我所知道的故事是匈牙利命名法被广泛误用,特别是在微软公司。命名法中的特殊前缀或后缀字符旨在以团队理解的简明方式提供有关数据的额外信息。静态类型从未打算成为其中的一部分。今天,人们(包括我自己)仍然常常在成员数据名称后添加下划线。这也是匈牙利命名法。 - wilhelmtell
2
@wilhelmtell:在http://en.wikipedia.org/wiki/Hungarian_notation上有一个合理的解释,而Simonyi关于所谓的“应用程序匈牙利”(第一种变体)的论文可以在http://msdn2.microsoft.com/en-us/library/aa260976(VS.60).aspx上找到。我找不到任何关于“系统匈牙利”(无用的变体)的明确解释;正如你所说,这起源于微软,当他们认为这不是一个好主意时,它可能从历史上消失了。 - Mike Seymour
4
你的意思是说在Google的每个人都是天才? - jimpic
3
Joel Spolsky的《让错误代码看起来像错误》一文中,对Apps Hungarian和Systems Hungarian的历史进行了有趣(如往常一样)的描述。 - pjh
显示剩余3条评论

38

我没有看到过这种情况,但可能与某些语言(特别是日耳曼语系的语言)对单词constant的拼写有关 - konstant


9

不要使用匈牙利命名法。如果您想让常量突出显示,请将它们全部大写。

另外一点:Google编码标准中有很多不良实践(从代码可读性的角度来看)。这就是当你通过委员会设计编码标准时所发生的事情。


6
可以认为全大写字母只是匈牙利命名法的一种稍微不同的形式。两者都只是传达语义含义的约定俗成的方式。 - Nick Forge
3
匈牙利命名法是在变量名称(在极端情况下,也包括类名和方法名)前缀中加入其类型的缩写的惯例。全大写保持了代码的可读性,而不会让初学者程序员问“为什么这里有‘k’?”因此,不能说它是匈牙利命名法的“不同形式”。 - Zac Howland
2
全大写的问题在于它通常更难阅读,或者说研究表明如此。 - Steven Craft
1
如果整个程序都是大写字母,那么是的。如果您定义了一个常量并全部使用大写字母,那么不需要。这只是为了使其更加突出:const int MYCONST = 3; if (MYCONST == x) {...} - Zac Howland
4
“不要使用匈牙利命名法,因为它有任意的命名约定,改用这种任意的命名约定!”这是我得到的感觉。Nick Forge说得对。以新手程序员为例并不合适,因为他们会问为什么变量要用全大写来命名。如果你需要向他们解释,那么解释为什么某些变量用'k'作为前缀也没有任何区别。唯一有效的反对匈牙利命名法的论点是将其与类型前缀如u32或f64相结合。 - A. L
显示剩余2条评论

6
这句话的意思是,该值是常量。

3
同意...但是常量用c拼写,那为什么不用c呢? - Johan Kotlinski
@doron: 我原以为C代表类(class)。 - UncleBens
6
我认为c是代表“char”的意思。但话说回来,它也可能代表“container”(容器)、“collation”(排序)、“collection”(集合)、“common”(常见)。这是避免使用这种样式的另一个原因。 - Thomas Matthews

6
我认为数学约定是先例。k在数学中经常被用作某个常数。


4

K代表着“konstant”,是constant(常量)的一个谐音词。它与编码风格有关。

这只是个人偏好,一些人和项目使用它们,这意味着他们也采用了匈牙利命名法(Hungarian notation),但很多人并不采用。这并不那么重要。

如果您不确定前缀或样式的含义,请始终检查项目是否有编码样式参考并阅读该参考。


3
实际上,每当我在TypeScript中定义常量时,我会做类似于这样的事情 -
NODE_ENV = 'production';

最近,我发现Flutter SDK中正在使用k前缀。对我来说,继续使用k前缀是有意义的,因为它帮助您的编辑器/IDE在代码库中搜索常量

enter image description here


2

我认为它的意思是系数(就像数学中的k一样)


0

这是一种惯例,可能来自数学。但也有其他关于常量的建议,例如Kernighan和Ritchie在他们的书《C语言》中建议将常量名称写成大写字母(例如#define MAX 55)。


1
我看到很多人在 #define 中使用 ALL_CAPS,而在 const 中使用 k。 - Johan Kotlinski

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接