我用两种方式构建了一个结构,见下文(图 A 和图 B)。在我的 .c 文件中,我像这样访问结构(图 C)。
有人可以解释为什么图 A 在使用图 C 访问时会出现编译器错误吗?另外,为什么图 B 在使用图 C 访问时不会导致编译器错误?图
我可以理解语法,如果结构在其自身内部使用,则名称需要位于两个位置:结构的顶部和底部。
它与编译器的某种“前向引用”有关吗?一个好的解释将不胜感激。
//Fig. A
typedef struct
{
uint32_t* block_address;
struct mem_table_entry_t* next_entry_ptr;
}mem_table_entry_t;
typedef struct
{
mem_table_entry_t two_kib[8];
}mem_table_t;
和
//Fig. B
typedef struct mem_table_entry_t
{
uint32_t* block_address;
struct mem_table_entry_t* next_entry_ptr;
}mem_table_entry_t;
typedef struct
{
mem_table_entry_t two_kib[8];
}mem_table_t;
...
//Fig. C
memory_table.two_kib[block].next_entry_ptr = &memory_table.two_kib[block+1];
最佳答案
在代码片段 A 中,struct
标记命名空间中尚未定义 struct mem_table_entry_t
。因此您不能像 struct mem_table_entry_t* next_entry_ptr; 中那样引用它。
您的代码片段 B 是正确的。
另请注意,typedef
命名空间与struct
标记命名空间不同。这意味着以下内容不兼容:
mem_table_entry_t two_kib1[8];
struct mem_table_entry_t two_kib2[8];
关于c - C 中结构体定义的变体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39660975/