c - 为什么 'struct' 关键字必须在 C 中的结构实例之前?

标签 c struct typedef

假设我在 C 中定义了一个结构。如果我声明该结构的一个实例,则有必要在它前面包含“struct”关键字。

// Define struct
struct Book {
   char title[50];
   char author[50];
   char subject[100];
   int book_id;
};

// Instantiate struct
int main()
{
    struct Book myBook;
}

我的问题:为什么 struct 关键字必须在结构的任何实例化之前?编译器似乎有大量信息可以推断“Book”是一个结构。

我知道你可以通过使用 typedef 来解决这个问题,但这真的看起来像是编译器应该已经知道的东西的样板代码。

最佳答案

由于使用关键字 struct、union 和 enum,这些类型的名称可以形成自己的 namespace ,不会与其他实体的名称冲突。

例如

#include <stdio.h>

int main(void) 
{
    struct Book 
    {
        const char *Book;
    } Book = { "The first favorite book" };

    struct Book otherBook = { .Book = "The second favorite book" };

    puts( Book.Book );
    puts( otherBook.Book );

    return 0;
}

关于c - 为什么 'struct' 关键字必须在 C 中的结构实例之前?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47555734/

相关文章:

c - 将指针字符数组中的值重新分配给该数组中的其他位置?

c - 为什么可以使用具有错误签名的比较函数调用 `qsort` 并且编译没有警告

c - 我为 Jacobi 迭代方法编写了这个 C 程序,但我得到 Nan 和无穷大作为我尝试更改的输出

struct - 编写单例结构的更短方法

struct - 如何正确迭代 Rust 中多级深度结构的所有记录?

javascript - 如何在 JSDOC 中扩展 typedef 参数?

C 项目结构 - 每个模块的 header 与一个大 header

c++ - 是否有任何可移植的方法来确保在不使用 c++11 填充字节的情况下定义结构?

c++ - 如何打破这种循环类型定义?

c++ - 关于带有模板的 c++ typedef