C 编译器如何区分typedef结构实现和与结构同名的类型?

C 编译器如何区分typedef结构实现和与结构同名的类型?,c,data-structures,struct,typedef,cs50,C,Data Structures,Struct,Typedef,Cs50,我一直在研究单链表和两种不同的typedef结构实现 CS50讲座第一讲讲解: //表示一个节点: 类型定义结构节点 { 整数; 结构节点*下一步; } 节点; 第二届CS50短片讲解: 类型定义结构列表 { 整数; 结构sllist*下一步; } sllnode; 我的问题是: 在前一个实现中,编译器如何区分节点、别名和节点、结构? 例如,为什么它能够区分struct和typedef,但不能使用相同的变量名来表示int和string 编译器如何区分节点、别名和节点、结构 很简单:它们是两种不同

我一直在研究单链表和两种不同的typedef结构实现

CS50讲座第一讲讲解:

//表示一个节点: 类型定义结构节点 { 整数; 结构节点*下一步; } 节点; 第二届CS50短片讲解:

类型定义结构列表 { 整数; 结构sllist*下一步; } sllnode; 我的问题是: 在前一个实现中,编译器如何区分节点、别名和节点、结构? 例如,为什么它能够区分struct和typedef,但不能使用相同的变量名来表示int和string

编译器如何区分节点、别名和节点、结构

很简单:它们是两种不同的东西。一个前面有struct关键字,另一个前面没有。typedef可以被视为创建别名。如果编译器单独看到节点,它会查看typedef以获取实际类型,而如果看到struct节点,它已经知道类型

例如,为什么它能够区分struct和typedef,但不能使用相同的变量名来表示int和string

那是另一种情况。无法重新定义已存在的类型名称。你不能做任何事;因为int已经存在,所以与您无法执行的操作相同:

struct s {
    int a;
};

struct s {
    int a;
};

这个单一的定义规则也适用于变量名和函数名。

它们被放在不同的“名称空间”或“类别”中。一个是结构节点,另一个是节点,它们将是相同的东西,但带有*next;由于尚未定义自引用成员节点,因此必须是Stutt节点。而对于C++,因此不是纯C,并且存在差异,可能是一个很好的读取。它还包括到C资源的链接。我没能这么快就找到类似的C-特定答案,尽管应该可以用它来搜索。