我在C中编译时收到此错误:
error: invalid use of undefined type ‘struct block’
blocks[0].i=1;
error: invalid use of undefined type ‘struct block’
blocks[0].j=1;
error: invalid use of undefined type ‘struct block’
blocks[0].k=1;
这是我的代码:
#include<stdlib.h>
#include<stdio.h>
void read_block(blocks);
int main()
{
struct block
{
int i,j,k;
} *blocks;
blocks=malloc(sizeof(struct block));
read_block(blocks);
printf("primo val %d\n",blocks[0].i);
}
void read_block(struct block *blocks)
{
blocks[0].i=1;
blocks[0].j=2;
blocks[0].k=3;
}
return(blocks);
}
定义了块,它们应该是一个结构。那么为什么编译器看不到它们呢?
答案 0 :(得分:3)
关于scope。
引用C11
,第6.2.1章,
对于标识符指定的每个不同实体,该标识符都是可见的(即可以是 仅在称为其作用域的程序文本区域内使用。 [...]
和
[...]如果声明符或类型说明符 声明标识符出现在一个块内或其中的参数声明列表中 函数定义,标识符具有块作用域,该作用域终止于 关联的块。 [...]
您已经在struct block
函数中定义了main()
,因此范围仅限于该函数(即,以}
的结尾main()
结尾)。
在main()
外,struct block
没有有效的定义。因此,您的编译器在抱怨。
将struct block
的声明移到main()
之外,并将其放入文件范围。
答案 1 :(得分:3)
由于您在main()
中定义了它们,因此它们的作用域只是
main()
。在它之外,它们不存在。要解决此问题,请移动
声明:
struct block
{
int i,j,k;
};
int main()
{
struct block *blocks;
/* ... */
还要注意,您需要在参数中声明类型 函数声明列表:
void read_block(blocks); /* bad */
void read_block(struct block *blocks);
最后,在结尾处还有一个附加的return
语句
您的代码,这将阻止该程序编译。一世
假设这只是在上面粘贴代码时的错字
问题。
答案 2 :(得分:1)
出现在C ++程序中的每个名称仅在某些可能的情况下有效 源代码的不连续部分称为其范围。 (ISO/IEC 9899:2011)
基本上,您的struct
仅在其中包含的{}
中可见。在您的情况下,这些括号是main
函数之一。在它们之外,您的结构不存在。
尝试以下操作:
struct block
{
int i,j,k;
};
int main()
{
block* blocks;
blocks=malloc(sizeof(struct block));
read_block(blocks);
printf("primo val %d\n",blocks[0].i);
}
void read_block(struct block *blocks)
{
blocks[0].i=1;
blocks[0].j=2;
blocks[0].k=3;
}
return(blocks);
}