范围如何影响同名的全局和本地结构?

时间:2013-03-20 04:36:16

标签: c

我已经声明了两个具有相同名称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;                        
}

2 个答案:

答案 0 :(得分:2)

块范围内的变量,其名称与全局范围相同,隐藏了全局标识符

ISO C9899 in 6.2.1说:

  

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

所以,如果您只是引用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