【发布时间】:2023-09-18 02:59:01
【问题描述】:
我正在检查具有不同链接的声明中可能发生的各种情况,我有 2 个问题。
我。我有以下代码:
#include <stdio.h>
static int a = 19;
int main(void)
{
extern int a;
{
extern int a;
printf("braces - %d\n", a);
}
printf("main - %d\n", a);
}
它与clang 和gcc 都可以很好地编译,19 的相同结果会在pritfs 中打印。据我所知,所有as 都是static,根据标准的 6.2.2.、4)。我唯一不明白的是,为什么文件范围 a 在 main 和大括号中对 a 可见?不应该按照脚注 31 隐藏文件范围吗?当我在其他文件中用不同的值定义另一个a 时,printfs` 的输出仍然是 19。
二。现在我执行以下操作:
#include <stdio.h>
static int a = 19;
int main(void)
{
int a; //change in this line
{
extern int a;
printf("braces - %d\n", a);
}
printf("main - %d\n", a);
}
gcc 大喊variable previously declared ‘static’ redeclared ‘extern’,而clang 表现正常并在main 中为a 打印a = 0(是的,它是垃圾值)并且在大括号中仍然是19。
我猜gcc 适用于此 6.2.2。 7) 的标准,而clang 没有。哪个解释是正确的,这里发生了什么?
我只能假设 gcc ''matches'' a 在大括号中与 a 在 main 中(没有链接)并使其成为外部链接,然后发现它与文件范围 @ 冲突987654344@。而且,为什么不在另一个文件中使用大括号 a 引用 a(脚注 31?)?
事实上,我目前的理解接近于here 中接受的答案中的理解,尽管我确实理解 C++ 与 C 有不同(我问的是 C)。
【问题讨论】:
标签: c scope static extern linkage