2012-06-17 132 views
1

下面的代码在编译时给出了这个错误我不明白为什么会发生这种情况。 switch语句的每一行都有这个错误。此代码是从与g++完美编译的代码中提取的,但我不明白gcc的问题。用gcc编译时出错

void 
str_murmurhash3_x64_128 (const void * key, const int len, 
          const uint32_t seed, void * out) 
{ 
    const uint8_t * data = (const uint8_t*)key; 
    const int nblocks = len/16; 

    uint64_t h1 = seed; 
    uint64_t h2 = seed; 

    uint64_t c1 = BIG_CONSTANT(0x87c37b91114253d5); 
    uint64_t c2 = BIG_CONSTANT(0x4cf5ad432745937f); 

    //---------- 
    // body 

    const uint64_t * blocks = (const uint64_t *)(data); 
    int i; 
    for(i = 0; i < nblocks; i++) 
    { 
     uint64_t k1 = getblock(blocks,i*2+0); 
     uint64_t k2 = getblock(blocks,i*2+1); 

     k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; 

     h1 = ROTL64(h1,27); h1 += h2; h1 = h1*5+0x52dce729; 

     k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; 

     h2 = ROTL64(h2,31); h2 += h1; h2 = h2*5+0x38495ab5; 
    } 

    //---------- 
    // tail 

    const uint8_t * tail = (const uint8_t*)(data + nblocks*16); 

    uint64_t k1 = 0; 
    uint64_t k2 = 0; 

    switch(len & 15) 
    { 
     case 15: k2 ^= uint64_t(tail[14]) << 48; 
     case 14: k2 ^= uint64_t(tail[13]) << 40; 
     case 13: k2 ^= uint64_t(tail[12]) << 32; 
     case 12: k2 ^= uint64_t(tail[11]) << 24; 
     case 11: k2 ^= uint64_t(tail[10]) << 16; 
     case 10: k2 ^= uint64_t(tail[ 9]) << 8; 
     case 9: k2 ^= uint64_t(tail[ 8]) << 0; 
       k2 *= c2; k2 = ROTL64(k2,33); k2 *= c1; h2 ^= k2; 

     case 8: k1 ^= uint64_t(tail[ 7]) << 56; 
     case 7: k1 ^= uint64_t(tail[ 6]) << 48; 
     case 6: k1 ^= uint64_t(tail[ 5]) << 40; 
     case 5: k1 ^= uint64_t(tail[ 4]) << 32; 
     case 4: k1 ^= uint64_t(tail[ 3]) << 24; 
     case 3: k1 ^= uint64_t(tail[ 2]) << 16; 
     case 2: k1 ^= uint64_t(tail[ 1]) << 8; 
     case 1: k1 ^= uint64_t(tail[ 0]) << 0; 
       k1 *= c1; k1 = ROTL64(k1,31); k1 *= c2; h1 ^= k1; 
    }; 

    //---------- 
    // finalization 

    h1 ^= len; h2 ^= len; 

    h1 += h2; 
    h2 += h1; 

    h1 = fmix(h1); 
    h2 = fmix(h2); 

    h1 += h2; 
    h2 += h1; 

    ((uint64_t*)out)[0] = h1; 
    ((uint64_t*)out)[1] = h2; 
} 

以下是th错误,错误中指定的所有行号对应于开关柜内的行。

murmurhash3.c:103:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:104:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:105:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:106:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:107:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:108:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:109:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:112:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:113:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:114:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:115:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:116:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:117:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:118:18: error: expected expression before ‘uint64_t’ 
murmurhash3.c:119:18: error: expected expression before ‘uint64_t’ 

任何帮助表示赞赏。

回答

3

你有一个语法错误:

case 15: k2 ^= uint64_t(tail[14]) << 48; 

尝试,而不是这样的:

case 15: k2 ^= ((uint64_t)tail[14]) << 48; 

另外,你希望落空的行为?如果没有,请在每个case声明后添加break;

+0

谢谢!有效。是的,我想要一个破解行为 –

+0

,但现在编译器正在给予制止 'murmurhash3.c:104:45:警告:不使用计算出的值[-Wunused-value] '。为什么这个警告来了? –

+0

你确定吗?我用'-std = c99 -Wall -pedantic'编译没有问题。 – dirkgently

0

据我了解,你已经使用uint64_t中来强制转换的无符号64位整数,所以尽量(uint64_t)tail[14], instead of uint64_t(tail[14])

+0

是的,我做到了。不管怎么说,多谢拉。 –