c - c中的错误:声明在全局范围内隐藏了一个变量
问题描述
当我尝试编译以下代码时,我收到此错误消息:
错误:声明隐藏了全局范围内的变量:
无效迭代器(节点*根)
我不明白我究竟在哪里隐藏或隐藏了我之前声明的全局变量。
我怎样才能解决这个问题?
// typedef node
typedef struct node
{
bool is_word;
struct node* children[27];
}
node;
node* root = NULL;
void iterator(node* root)
{
for(int i = 0; i < 27; i++)
{
if (root -> children[i] != NULL)
{
iterator(root -> children[i]);
}
}
free(root);
return;
}
解决方案
编译器的错误信息很草率;“全局范围”在 C 标准中没有定义。它试图告诉你的是:
node* root = NULL;
在文件范围内声明root
为标识符(从其声明到翻译单元 [正在编译的源文件] 的结尾都可以看到),并且:
void iterator(node *root)
在块范围内声明root
为标识符(从其声明到定义函数的块末尾可见)。
这些声明引用了两个不同的对象。第一个是具有静态存储持续时间的对象——只要您的程序正在执行,它就存在。第二个是函数参数——它只在函数执行时存在,并且每次调用函数时都有一个单独的实例。
函数内部,root
仅指函数参数。前一个声明是隐藏的,函数内的任何代码都不能通过其名称引用。(这是编译器错误消息中的另一点草率;C 标准使用“隐藏”,而不是“阴影”。)
就 C 标准而言,这并没有错——您可以隐藏标识符。然而,就人类而言,它可能会引起问题,因为一个人可能会root
在一个地方写它来指代root
另一个地方,因为他们没有看到或忘记第二个声明。这就是编译器可能对此有可选警告的原因。看来您正在编译时启用了该警告,并且可以选择将警告提升为错误。
要修复它,您应该为静态对象和函数参数使用不同的名称,或者应该关闭编译器警告以隐藏标识符,无论您认为哪个适合您的项目。
推荐阅读
- kubernetes - Kustomize nameSuffix 跳过一些资源
- google-cloud-platform - 来自快照的 Pub/Sub 消息未发送到 Dataflow 管道
- python - 如何抑制绘制在饼图上的一些 autopct 值
- function - 在 Google 表格中取消缩短网址
- java - 带有 openpdf 的 FlyingSaucer 无法正确渲染弹性框
- node.js - 处理节点应用程序时从 Nginx 获取 502
- python-2.7 - 如何将 secod 添加到 datetime.time 对象
- gatsby - 从 onCreateNode 上的外部图像 URL 创建文件图像
- python - 在 os.system python 上获取 curl
- javascript - 量角器:如何按日期/时间对列表进行排序?