c中的错误:声明在全局范围中隐藏变量

c中的错误:声明在全局范围中隐藏变量,c,global-variables,C,Global Variables,当我尝试编译以下代码时,会收到以下错误消息: 错误:声明在全局范围中隐藏变量: 无效迭代器(节点*根) 我不知道我在哪里隐藏或隐藏我之前声明的全局变量 我怎样才能解决这个问题 // typedef node typedef struct node { bool is_word; struct node* children[27]; } node; node* root = NULL; void iterator(node* root) { for(int i = 0;

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

错误:声明在全局范围中隐藏变量:

无效迭代器(节点*根)

我不知道我在哪里隐藏或隐藏我之前声明的全局变量

我怎样才能解决这个问题

// 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;
}
//typedef节点
类型定义结构节点
{
布尔是一个词;
结构节点*子节点[27];
}
节点;
node*root=NULL;
无效迭代器(节点*根)
{
对于(int i=0;i<27;i++)
{
if(root->children[i]!=NULL)
{
迭代器(root->children[i]);
}
}
自由根;
返回;
}

编译器的错误消息太草率;“全局范围”不是C标准中定义的内容。它想告诉你的是:

node* root = NULL;
root
声明为文件范围内的标识符(从其声明到翻译单元[正在编译的源文件]的结尾可见),并且:

在块范围中将
root
声明为标识符(从其声明到定义函数的块的末尾都可见)

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

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

关于C标准,这没有什么错,允许您隐藏标识符。然而,对于人类来说,它可能会导致问题,因为一个人可能在一个地方写
,目的是在另一个地方引用
,因为他们没有看到或忘记第二个声明。这就是为什么编译器可能会有关于此的可选警告。您似乎在编译时启用了该警告,并且具有将警告提升为错误的选项


要修复它,您应该为静态对象和函数参数使用不同的名称,或者应该关闭编译器隐藏标识符的警告,无论您认为哪个适合您的项目;“全局范围”不是C标准中定义的内容。它想告诉你的是:

node* root = NULL;
root
声明为文件范围内的标识符(从其声明到翻译单元[正在编译的源文件]的结尾可见),并且:

在块范围中将
root
声明为标识符(从其声明到定义函数的块的末尾都可见)

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

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

关于C标准,这没有什么错,允许您隐藏标识符。然而,对于人类来说,它可能会导致问题,因为一个人可能在一个地方写
,目的是在另一个地方引用
,因为他们没有看到或忘记第二个声明。这就是为什么编译器可能会有关于此的可选警告。您似乎在编译时启用了该警告,并且具有将警告提升为错误的选项


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

您使用的编译器和选项可能重复?您使用的编译器和选项可能重复?