首页 > 解决方案 > 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;
}

标签: cglobal-variables

解决方案


编译器的错误信息很草率;“全局范围”在 C 标准中没有定义。它试图告诉你的是:

node* root = NULL;

在文件范围内声明root为标识符(从其声明到翻译单元 [正在编译的源文件] 的结尾都可以看到),并且:

void iterator(node *root)

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

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

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

就 C 标准而言,这并没有错——您可以隐藏标识符。然而,就人类而言,它可能会引起问题,因为一个人可能会root在一个地方写它来指代root另一个地方,因为他们没有看到或忘记第二个声明。这就是编译器可能对此有可选警告的原因。看来您正在编译时启用了该警告,并且可以选择将警告提升为错误。

要修复它,您应该为静态对象和函数参数使用不同的名称,或者应该关闭编译器警告以隐藏标识符,无论您认为哪个适合您的项目。


推荐阅读