2017-09-18 258 views
0

我正在C中構建哈希表。 除編譯時報告錯誤的變量cur_item外,似乎一切正常。C - 聲明中的未聲明變量

下面是代碼:

void insert(hash_table* ht, const char* key, const char* value) {    
    const int load = ht->count * 100/ht->size;        
    if (load > 70) {               
    resize_up(ht);               
    }                   
    item* item = new_item(key, value);           
    int index = get_hash(item->key, ht->size, 0);        
    item* cur_item = ht->items[index];           
    int i = 1;                 
    while (cur_item != NULL) { 
    /** PROCESS **/ 
    } 
} 

這裏是我的Makefile中(不是最好的我猜的):

main: main.o hash_table.o prime.o            
      gcc -g -Wall -lm -o main.out ./build/main.o ./build/hash_table.o ./\ 
    build/prime.o                 

main.o: ./src/main.c ./src/hash_table.h          
      gcc -c ./src/main.c -o ./build/main.o        

hash_table.o: ./src/hash_table.c ./src/hash_table.h       
     gcc -c ./src/hash_table.c -o ./build/hash_table.o     

prime.o: ./src/prime.c ./src/prime.h           
     gcc -c ./src/prime.c -o ./build/prime.o  

這裏是錯誤:

./src/hash_table.c: In function ‘insert’: 
./src/hash_table.c:65:9: error: ‘cur_item’ undeclared (first use in this function); did you mean ‘del_item’? 
    item* cur_item = ht->items[index]; 
     ^~~~~~~~ 
     del_item 
./src/hash_table.c:65:9: note: each undeclared identifier is reported only once for each function it appears in 
make: *** [Makefile:10: hash_table.o] Error 1 

的類型item代表我創建的結構。 del_item是一個函數,沒有理由在那裏使用它。

如果我在if循環之前聲明cur_item,然後在get_hash()函數之後初始化它的值,則編譯工作正常。

有人可以解釋爲什麼第一次編譯失敗?在我的Makefile中是否有缺失?

+3

'item * item'沒有使編譯器不高興,爲什麼'item * cur_item'?也許你不會向我們展示我們需要的一切...... – gsamaras

+1

另外,變量應該在任何執行語句之前在頂部初始化。即使你使用的是最新的C標準,也應該考慮這種情況,否則代碼會變得醜陋和嘈雜。 #justSayin – tilz0R

+0

我願意給你更多的信息,但我找不到相關的幫助你。我在源代碼中聲明瞭其他'item'變量,這是唯一一個打破 – Cerclique

回答

4

您剛剛將標識符item超載爲變量。那麼編譯器會很困惑,並且當你試圖聲明cur_item時不知道你想要什麼。

請勿爲變量和類型使用相同的名稱。顯然這會讓你和編譯器感到困惑。

+0

對不起,對於遲到的答案,但我無法提前測試。你是對的,解決了我的問題。我並不聰明地將我的變量命名爲與我的結構類型完全相同。謝謝 ! – Cerclique