【问题标题】:error in c: declaration shadows a variable in the global scopec中的错误:声明在全局范围内隐藏了一个变量
【发布时间】:2018-11-10 11:12:46
【问题描述】:

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

错误:声明在全局范围内隐藏了一个变量:

void 迭代器(节点*根)

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

我该如何解决这个问题?

// 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 global-variables


【解决方案1】:

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

node* root = NULL;

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

void iterator(node *root)

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

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

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-05-10
    • 2017-08-19
    • 2021-11-16
    • 2017-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多