对C中变量的范围感到困惑
Confusing about the scope of the variables in C
Code 1
#include <stdio.h>
int T;
int main()
{
struct T{ double x;};
printf("%d", sizeof(T));
return 0;
}
Output: 4
Code 2
#include <stdio.h>
struct T{ double x;};
int main()
{
int T;
printf("%d", sizeof(T));
return 0;
}
Output: 4
对于 code 1
,我认为输出是全局变量的大小 (int T
),这就是为什么它给出 4.
但是对于code 2
,它给出输出4,根据全局变量逻辑,对于struct T{ double x;};
应该输出8。
这里,全局变量概念不正确-我认为。
任何人都可以解释为什么输出看起来像这样吗?
这里的问题不是作用域,而是结构标记如何与其他符号存在于不同的 命名空间 中。
因此,当您执行 sizeof(T)
时,您 总是 得到变量 T
.
要在 C 中获取结构标记,您需要 struct
关键字。如 sizeof(struct T)
.
如果你使用 typedef
情况会有所不同:
struct T
{
double x;
} T;
那么您将在 "normal" 命名空间中拥有一个名为 T
的类型。另一方面,该类型会与具有相同名称的变量冲突,因此您会收到编译器错误。
Code 1
#include <stdio.h>
int T;
int main()
{
struct T{ double x;};
printf("%d", sizeof(T));
return 0;
}
Output: 4
Code 2
#include <stdio.h>
struct T{ double x;};
int main()
{
int T;
printf("%d", sizeof(T));
return 0;
}
Output: 4
对于 code 1
,我认为输出是全局变量的大小 (int T
),这就是为什么它给出 4.
但是对于code 2
,它给出输出4,根据全局变量逻辑,对于struct T{ double x;};
应该输出8。
这里,全局变量概念不正确-我认为。
任何人都可以解释为什么输出看起来像这样吗?
这里的问题不是作用域,而是结构标记如何与其他符号存在于不同的 命名空间 中。
因此,当您执行 sizeof(T)
时,您 总是 得到变量 T
.
要在 C 中获取结构标记,您需要 struct
关键字。如 sizeof(struct T)
.
如果你使用 typedef
情况会有所不同:
struct T
{
double x;
} T;
那么您将在 "normal" 命名空间中拥有一个名为 T
的类型。另一方面,该类型会与具有相同名称的变量冲突,因此您会收到编译器错误。