2012-06-17 130 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

是的,我做到了。不管怎麼說,多謝拉。 –