1

我已经声明了两个具有相同名称 foo 的不同结构,因为其中一个被声明为全局的,并且可以被程序中的任何函数轻松访问。但是我在 main 中有第二个结构,它是本地声明的。

最坏的情况是我需要在主要访问它们?我通过声明具有不同名称的结构变量来做到这一点。但现在的问题是我需要检查结构的大小......我应该如何获得局部结构的大小而不是全局结构?

#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;                        
}
4

2 回答 2

2

块作用域内与全局作用域同名的变量隐藏全局标识符

6.2.1 中的 ISO C9899说:

如果一个标识符在同一个名称空间中指定了两个不同的实体,则作用域可能会重叠。如果是这样,一个实体的范围(内部范围)将是另一个实体范围(外部范围)的严格子集。在内部范围内,标识符指定在内部范围内声明的实体;在外部范围内声明的实体在内部范围内隐藏(不可见)。

因此,struct foo如果您仅引用main().

建议:对这些类型使用不同的名称或使用不同名称的变量或对结构类型使用 typedef。

printf("Size of struct foo is: %d\n",sizeof(struct foo));将只给出本地结构 foo 的大小(取决于 28 或 25)。

于 2013-03-20T05:07:07.393 回答
1

标准 C 不提供任何方式来引用被本地声明隐藏的标识符(对象名称或类型名称)。

struct foo在这种情况下,您可以通过使用对象的大小来查看全局的大小sizeof globe_foo

GCC(和支持其扩展的编译器)提供了一种引用对象类型的方法,__typeof__. 因此,在 GCC 中,您可以参考globe_foowith的类型__typeof__(struct globe_foo)

另一种选择是给全局类型一个别名,使用typedef. 如果在文件范围内声明typedef struct foo foo_t;,则foo_t即使struct foo隐藏该类型,该类型也将在函数内可见。

打印尺寸(类型的值size_t)时,您应该使用带有,而不是的%zu规范。printf%d

于 2013-03-20T10:14:21.587 回答