是一个结构{...}; 一个类型或一个未命名的变量?

Pau*_*vie 6 c struct

在文件范围,以下是类型声明还是未命名变量?

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
};
Run Code Online (Sandbox Code Playgroud)

如果是类型定义,那么有什么区别:

typedef struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
};
Run Code Online (Sandbox Code Playgroud)

(背景:请参阅我的答案将变量从全局变为本地 - C,我相信第一个引入了一个未命名的变量,然后由编译器对其进行优化.)

注意:该问题已被标记为可能重复的结构成员标识符放在什么范围内?但我相信我并不是在询问有关成员范围的问题,而是对申报实际创造的内容提出疑问.然而.回答C++中'struct'和'typedef struct'的区别?解释我的问题.

Sou*_*osh 6

按照C标准,结构声明的形式如

struct student_s {
    char* name;
    int age;
    double height;
    struct student_s* next;   
};
Run Code Online (Sandbox Code Playgroud)

是一种类型的声明.引用C11,第§6.7.2.1

struct-or-union-specifier中struct-declaration-list的存在在转换单元中声明了一个新类型.struct-declaration-list是结构或联合成员的一系列声明.[...]

Cstandard不要求为该类型创建变量(命名或未命名).

在你的第二个片段中,你实际上(尝试)typedef什么.但是,如果您将代码段更改为

typedef struct {
         //.....members
} student_s ;
Run Code Online (Sandbox Code Playgroud)

你将创建一个你可以在以后使用的类型 student_s(typedef到一个未命名的结构类型).

FWIW,我们从不谈论过这里创建的变量.这都是关于类型的.