C 作用域如何影响同名的全局和局部结构?
我声明了两个同名的不同结构foo,因为其中一个被声明为全局结构,并且可以被程序中的任何函数轻松访问。但我在main中有第二个结构,它是本地声明的 最坏的情况是最坏的,我需要访问它们的主要?我是通过用不同的名称声明struct变量来实现的。但现在的问题是我需要检查结构的大小。。。如何获得本地结构而不是全局结构的大小C 作用域如何影响同名的全局和局部结构?,c,C,我声明了两个同名的不同结构foo,因为其中一个被声明为全局结构,并且可以被程序中的任何函数轻松访问。但我在main中有第二个结构,它是本地声明的 最坏的情况是最坏的,我需要访问它们的主要?我是通过用不同的名称声明struct变量来实现的。但现在的问题是我需要检查结构的大小。。。如何获得本地结构而不是全局结构的大小 #include <stdio.h> #include <stdlib.h> struct foo { char arr1[200]; int
#include <stdio.h>
#include <stdlib.h>
struct foo {
char arr1[200];
int x_val;
int y_val;
float result;
};
struct foo globe_foo;
int main()
{
struct foo {
char c;
char arr[20];
int x;
};
struct foo my_foo;
globe_foo.x_val = 20;
printf("Globe foo x_val: %d\n",globe_foo.x_val);
printf("Size of struct foo is: %d\n",sizeof(struct foo));
//how to check size of global decleared stuct foo?
printf("Size of struct foo is: %d\n",sizeof(struct foo));
system("pause");
return 0;
}
#包括
#包括
结构foo{
char-arr1[200];
int x_val;
国际货币基金组织;
浮动结果;
};
结构foo globe\u foo;
int main()
{
结构foo{
字符c;
char-arr[20];
int x;
};
struct foo my_foo;
地球仪=20;
printf(“Globe foo x_val:%d\n”,Globe foo.x_val);
printf(“struct foo的大小为:%d\n”,sizeof(struct foo));
//如何检查全局清除的stuct foo的大小?
printf(“struct foo的大小为:%d\n”,sizeof(struct foo));
系统(“暂停”);
返回0;
}
名称与全局范围相同的块范围内的变量隐藏全局标识符
说:
如果标识符在同一名称空间中指定两个不同的实体,则范围可能重叠。如果是这样,一个实体的范围(内部范围)将是另一个实体范围(外部范围)的严格子集。在内部范围内,标识人指定在内部范围内声明的实体;外部范围中声明的实体在内部范围中隐藏(不可见)
因此,如果只引用main()
中的typename,那么全局struct foo
将被完全隐藏(好像它不在那里一样)
建议:对这些类型使用不同的名称或使用具有不同名称的变量,或者对结构类型使用typedef
您的
printf(“struct foo的大小为:%d\n”,sizeof(struct foo))
将只给出本地结构foo的大小(取决于28或25)。标准C不提供任何方法来引用由本地声明隐藏的标识符(对象名或类型名)
在这种情况下,您可以通过使用对象的大小来查看全局struct foo
,即globe\u foo的大小
GCC(以及支持其扩展的编译器)提供了一种引用对象类型的方法,\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。因此,在GCC中,您可以使用\uuuuuutypeof(struct globe\u foo)
引用globe\u foo的类型
另一个选项是使用typedef
为全局类型提供别名。如果在文件范围内声明typedef struct foo foo\t
,则类型foo\t
将在函数中可见,即使struct foo
被隐藏
打印尺寸(类型为size\t
的值)时,应使用%zu
规范和printf
,而不是%d
为什么不使用不同的名称来定义它们?试试sizeof(globe\foo)
。是的,我可以……但我要努力理解C@studyembedded经验法则是局部声明隐藏全局声明。使用不同的名称,不要使自己复杂化。