我已经声明了两个具有相同名称foo的不同结构,因为其中一个被声明为全局,并且可以通过程序中的任何函数轻松访问。但我在main中有第二个结构,它是在本地声明的。
最糟糕的是,我需要在主要访问它们两个?我通过声明具有不同名称的struct变量来做到这一点。但现在问题是我需要检查结构的大小......我应该如何得到本地结构的大小而不是全局结构?
#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;
}
答案 0 :(得分:2)
块范围内的变量,其名称与全局范围相同,隐藏了全局标识符
如果标识符在同一名称空间中指定两个不同的实体,则范围可能会重叠。如果是这样,一个实体(内部范围)的范围将是另一个实体(外部范围)范围的严格子集。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内隐藏(并且不可见)。
所以,如果您只是引用struct foo
中的类型名称,那么全局main()
完全隐藏(好像它不在那里)。
建议:对这些类型使用不同的名称或使用不同名称的变量,或者键入结构类型。
您的printf("Size of struct foo is: %d\n",sizeof(struct foo));
将只提供本地struct foo的大小(28或25取决于)。
答案 1 :(得分:1)
标准C不提供任何方式来引用本地声明隐藏的标识符(对象名称或类型名称)。
在这种情况下,您可以使用对象的大小struct foo
来查看全局sizeof globe_foo
的大小。
GCC(以及支持其扩展的编译器)提供了一种引用对象类型__typeof__
的方法。因此,在GCC中,您可以使用globe_foo
来引用__typeof__(struct globe_foo)
的类型。
另一种选择是为全局类型赋予typedef
别名。如果在文件范围内您声明typedef struct foo foo_t;
,那么即使隐藏foo_t
,函数内部也会显示struct foo
类型。
打印尺寸(size_t
类型的值)时,您应使用%zu
规范与printf
,而不是%d
。