c - C 中结构体定义的变体

标签 c data-structures struct syntax

我用两种方式构建了一个结构,见下文(图 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/

相关文章:

c - 列出 header 中声明但源文件中缺失的所有函数?

c - 当我打印缓冲区中的内容时,我的代码打印垃圾值

c++ - 用于插入的高效数据结构

JSON:将填充的结构嵌套到新结构中

在函数内的堆栈上创建一个结构体,并将其分配给在另一个函数中创建的数组的数组位置

c - 这段 C 代码有什么问题?

c++ - lua - 在 C 中存储闭包,在 C 中调用异步

c - 哈希表遍历操作

java - Java 中是否有相当于 Android 的 LRUCache 的东西?

c - 为什么递增指针可以工作,但将其视为数组会失败?第2部分