【发布时间】:2016-05-10 17:50:18
【问题描述】:
我被分配了将 Windows 程序移植到 OS X 的任务。最初是用 C++ 编写的,我很喜欢它,因为我不经常使用 C 系列语言,并且喜欢使用 Objective端口中的 C++。
但是,Windows 源代码做了一些奇怪的事情,我想知道这是否是一种标准做法。我们在 Windows 和 OS X 上使用的 API 期望一个特定的对象方法被传递一个无符号的 short。最初的 Windows 开发人员创建了以下函数来计算该值:
static unsigned short hashcode ( const char* value ) {
int h = 0 ;
unsigned long length = strlen ( value ) ;
for ( int i = 0 ; i < length ; i++ ) {
h = ( 31 * h ) + value[i] ;
}
return h ;
}
请注意,虽然函数返回 unsigned short,但它返回的变量被声明为 int。我查看了文档,OS X 和 Windows 都将 unsigned short 定义为 2 个字节,将 int 定义为 4。
如果不考虑数据类型,传递给此函数的值会导致函数返回非常大的数字,在某些情况下会返回几十位数字。在一种情况下,我用另一种语言不那么严格的类型复制了算法,我得到了2081357292912430390912 的值。当我将上述函数包装在命令行实用程序中时,相同的字符串返回值40576,我猜是因为这是较长值的截断版本。
所以我有两个问题。首先,为什么,如果 hashcode 被声明返回一个 unsigned short 并且它实际上正在返回并且 int 没有编译器抱怨?这不就是严格数据类型声明的初衷吗?确保函数和方法接收和返回预期的数据类型?
其次,这种截断是标准做法吗?对我来说这似乎很奇怪,首先要利用隐式转换,但也没有评论告诉某人正在发生这种情况(而且我无权联系原始开发人员询问)。由于它没有被评论为“特殊”,也许它只是 C/C++ 中的标准习语?
【问题讨论】:
-
什么是“自动投射”?那是矛盾的?要么投,要么不投。
-
也许“隐式转换”是一个更好的术语?
return h与return (unsigned short) h? -
我认为您的意思是“隐式转换”而不是“自动转换”。在 C++ 中,强制转换是显式转换。
-
请将此源代码提交给thedailywtf.com
-
@SamVarshavchik,为什么?这是一个 djb 哈希函数,还不错。