Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 作用域如何影响同名的全局和局部结构?_C - Fatal编程技术网

C 作用域如何影响同名的全局和局部结构?

C 作用域如何影响同名的全局和局部结构?,c,C,我声明了两个同名的不同结构foo,因为其中一个被声明为全局结构,并且可以被程序中的任何函数轻松访问。但我在main中有第二个结构,它是本地声明的 最坏的情况是最坏的,我需要访问它们的主要?我是通过用不同的名称声明struct变量来实现的。但现在的问题是我需要检查结构的大小。。。如何获得本地结构而不是全局结构的大小 #include <stdio.h> #include <stdlib.h> struct foo { char arr1[200]; int

我声明了两个同名的不同结构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;                        
}
#包括
#包括
结构foo{
char-arr1[200];
int x_val;
国际货币基金组织;
浮动结果;
};
结构foo globe\u foo;
int main()
{
结构foo{
字符c;
char-arr[20];
int x;
}; 
struct foo my_foo;
地球仪=20;
printf(“Globe foo x_val:%d\n”,Globe foo.x_val);
printf(“struct foo的大小为:%d\n”,sizeof(struct foo));
//如何检查全局清除的stuct foo的大小?
printf(“struct foo的大小为:%d\n”,sizeof(struct foo));
系统(“暂停”);
返回0;
}

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

说:

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

因此,如果只引用
main()
中的typename,那么全局
struct foo
将被完全隐藏(好像它不在那里一样)

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


您的
printf(“struct foo的大小为:%d\n”,sizeof(struct foo))
将只给出本地结构foo的大小(取决于28或25)。

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

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

GCC(以及支持其扩展的编译器)提供了一种引用对象类型的方法,
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuu
。因此,在GCC中,您可以使用
\uuuuuutypeof(struct globe\u foo)
引用
globe\u foo的类型

另一个选项是使用
typedef
为全局类型提供别名。如果在文件范围内声明
typedef struct foo foo\t
,则类型
foo\t
将在函数中可见,即使
struct foo
被隐藏


打印尺寸(类型为
size\t
的值)时,应使用
%zu
规范和
printf
,而不是
%d

为什么不使用不同的名称来定义它们?试试
sizeof(globe\foo)
。是的,我可以……但我要努力理解C@studyembedded经验法则是局部声明隐藏全局声明。使用不同的名称,不要使自己复杂化。