c中的变量名优先级

Mag*_*sch 1 c

这是一个后续问题

请考虑以下示例代码:

#include <stdio.h>
int asdf = 5;
int main(void) {
    sub(10);
    return 0;
}
int sub (int asdf)
{
    printf("%d\n",asdf);
}
Run Code Online (Sandbox Code Playgroud)

在这种情况下,全局变量和本地参数都使用相同的名称asdf.代码输出10,因此使用局部变量.不会抛出编译错误或警告.

全局变量仍然可以从内部访问sub(),正如我将sub声明更改为时所证明的那样

int sub (int asd)
Run Code Online (Sandbox Code Playgroud)

代码输出5.所以我知道sub()可以访问全局变量,但事实并非如此.

我无法在c标准中找到关于范围优先级的明确定义,所以我的问题是:

考虑到上面的场景,将本地和全局变量命名为仅仅是不好的做法,还是调用错误/ UB?

use*_*109 6

来自C11草案规范

6.2.1 标识符的范围

4 [...]如果声明标识符的声明符或类型说明符出现在块内或函数定义中的参数声明列表中,则标识符具有块作用域,该作用域终止于关联块的末尾.

[...]如果标识符指定同一名称空间中的两个不同实体,则范围可能会重叠.如果是这样,一个实体(内部范围)的范围将严格地在另一个实体(外部范围)的范围之前结束.在内部范围内,标识符指定在内部范围内声明的实体; 在外部作用域中声明的实体在内部作用域内隐藏(并且不可见).

因此,声明一个名为的函数参数会asdf隐藏函数中的全局变量asdf.为本地和全局变量赋予相同的标识符是不好的做法,但规范允许.