gpt4 book ai didi

c - c 错误 : declaration shadows a variable in the global scope

转载 作者:行者123 更新时间:2023-11-30 14:45:11 24 4
gpt4 key购买 nike

当我尝试编译以下代码时,我收到此错误消息:

error: declaration shadows a variable in the global scope:

void iterator(node* root)

我不明白我到底在哪里隐藏或隐藏了之前声明的全局变量。

我该如何解决这个问题?

// 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 声明为 block 范围内的标识符(从其声明到定义函数的 block 末尾都可见)。

这些声明引用两个不同的对象。第一个是具有静态存储持续时间的对象——只要程序正在执行,它就存在。第二个是函数参数 - 它仅在函数执行时存在,并且每次调用函数时都会有一个单独的实例。

在函数内部,root 仅指函数参数。前一个声明是隐藏的,函数内的任何代码都不能通过其名称来引用。 (这是编译器错误消息中的另一点草率;C 标准使用“隐藏”,而不是“影子”。)

这对于 C 标准来说并没有什么问题——你可以隐藏标识符。然而,对于人类来说,它可能会导致问题,因为一个人可能会在一个地方编写 root ,打算引用另一个地方的 root ,因为他们没有看到或者忘记了第二个声明。这就是为什么编译器可能会对此发出可选警告。看来您正在启用该警告的情况下进行编译,并且可以选择将警告升级为错误。

要解决此问题,您应该为静态对象和函数参数使用不同的名称,或者应该关闭隐藏标识符的编译器警告,无论您认为适合您的项目。

关于c - c 错误 : declaration shadows a variable in the global scope,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53238366/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com