我声明了两个具有相同名称foo的不同结构,因为其中一个被声明为全局的,并且可以很容易地被程序中的任何函数访问。但是我在main中有第二个结构体,它是局部声明的。
最糟糕的是我需要在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: %dn",globe_foo.x_val);
printf("Size of struct foo is: %dn",sizeof(struct foo));
//how to check size of global decleared stuct foo?
printf("Size of struct foo is: %dn",sizeof(struct foo));
system("pause");
return 0;
}
块作用域中与全局作用域名称相同的变量隐藏了全局标识符
ISO C9899在6.2.1中说:
如果标识符在同一名称空间中指定两个不同的实体,则作用域可能重叠。如果是这样,一个实体的范围(内部范围)将是另一个实体范围(外部范围)的严格子集。在内部作用域中,标识符指定在内部作用域中声明的实体;在外部作用域中声明的实体在内部作用域中是隐藏的(不可见的)。
所以这里全局struct foo
是完全隐藏的(就好像它不存在一样),如果你只是引用main()
内部的类型名。
建议:对这些类型使用不同的名称或使用不同名称的变量,或者对结构类型进行类型定义。
您的printf("Size of struct foo is: %dn",sizeof(struct foo));
将只给出本地结构符的大小(28或25取决于)。
标准C不提供任何方法来引用由局部声明隐藏的标识符(对象名或类型名)。
在本例中,您可以通过使用对象sizeof globe_foo
的大小来查看全局struct foo
的大小。
GCC(以及支持其扩展的编译器)提供了一种引用对象类型__typeof__
的方法。因此,在GCC中,您可以使用__typeof__(struct globe_foo)
来引用globe_foo
的类型。
另一个选择是给全局类型一个别名,用typedef
。如果在文件作用域中声明了typedef struct foo foo_t;
,那么即使struct foo
是隐藏的,foo_t
类型在函数内部也是可见的。
在打印尺寸(类型为size_t
的值)时,您应该使用%zu
规范和printf
,而不是%d
。