【问题标题】:C - Undeclared variable at declaration [duplicate]C - 声明时未声明的变量[重复]
【发布时间】:2017-09-18 08:15:23
【问题描述】:

我正在用 C 语言构建一个哈希表。 除了这个变量 cur_item 之外,一切似乎都运行良好,它在编译时报告我一个错误。

代码如下:

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 中是否缺少某些内容?

【问题讨论】:

  • item* item 并没有让编译器不高兴,那为什么item* cur_item 呢?可能你没有向我们展示我们需要的一切......
  • 另外,变量应该在任何执行语句之前初始化。即使您使用的是最新的 C 标准,也应该考虑到这一点,否则代码会变得丑陋和嘈杂。 #justSayin
  • 我愿意为您提供更多信息,但找不到相关的信息来帮助您。我已经在我的源代码中声明了其他 item 变量,而这个变量是唯一破坏的变量
  • 尝试使用选项 -std=gnu99 进行编译
  • @tilz0R 一些编码风格想要这样,而另一些则不需要。我认为在第一次使用时引入变量是一种很好的风格。不要将中世纪的要求强加给新手。

标签: c


【解决方案1】:

您刚刚将标识符item 重载为变量。所以当你尝试声明cur_item时,编译器会很困惑,不知道你想要什么。

不要对变量和类型使用相同的名称。显然这会让你和编译器感到困惑。

【讨论】:

  • 很抱歉回答迟了,但我不能早点测试。你是对的,这解决了我的问题。将我的变量命名为与我的结构类型完全相同的名称并不聪明。谢谢!
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-07-15
  • 2020-01-15
  • 2016-01-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多