cHow不影响同名的全局和局部结构

  • 本文关键字:全局 局部 结构 影响 cHow
  • 更新时间 :
  • 英文 :


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

最新更新