非常简单的C结构中的编译错误

非常简单的C结构中的编译错误,c,C,以上内容无法编译。但是,当我将结构更改为: typedef struct test { int a; }; int main(void) { test t; t.a = 3; } 一切正常。为什么会这样?我见过很多代码示例,其中struct与typedef位于同一行,但它不是为我编译的 typedef的一般语法是 typedef struct { int a; }test; 编辑 请参阅下面的Eric产后评论 您只会得到一个警告:空声明中的存储类说明符无用

以上内容无法编译。但是,当我将结构更改为:

typedef struct test { 
    int a;
}; 

int main(void) { 
test t; 
t.a = 3; 
} 
一切正常。为什么会这样?我见过很多代码示例,其中struct与typedef位于同一行,但它不是为我编译的

typedef的一般语法是

typedef struct {
    int a; 
}test; 
编辑

请参阅下面的Eric产后评论

您只会得到一个
警告:空声明中的存储类说明符无用

Ref:-

类型定义的一般语法为

typedef struct {
    int a; 
}test; 
编辑

请参阅下面的Eric产后评论

您只会得到一个
警告:空声明中的存储类说明符无用


Ref:-

当您对结构使用
typedef
时,
typedef
名称放在结构后面。这就是C被指定工作的方式

如果使用第一个关键字(显然没有
typedef
),则必须使用
struct
关键字,第二个关键字只需使用名称即可

您还可以对结构和
typedef
等使用相同的名称

 typedef type-declaration      alias-name;
          |                     |
          |                     |
          |                     |
 typedef struct {int a; }      test; //2nd one is correct
          |                     |              
          |                     |
 typedef struct test { int a;}    ;  //You missed the synonym/alias name here

typedef
与结构一起使用时,
typedef
名称放在结构后面。这就是C被指定工作的方式

如果使用第一个关键字(显然没有
typedef
),则必须使用
struct
关键字,第二个关键字只需使用名称即可

您还可以对结构和
typedef
等使用相同的名称

 typedef type-declaration      alias-name;
          |                     |
          |                     |
          |                     |
 typedef struct {int a; }      test; //2nd one is correct
          |                     |              
          |                     |
 typedef struct test { int a;}    ;  //You missed the synonym/alias name here

我将
typedef
概念化为有效使用两个参数:

typedef struct test { 
    int a;
} test;
(我知道这不是100%准确,但为了简单起见,这是一种有用的查看方式)

例如:

typedef "original type"  "new type";
在您的示例中:

typedef unsigned int HRESULT;
// HRESULT is a new type that is the same as an unsigned int.
您已经通过了第一个“param”,一个名为
test
struct
,但从未使用第二个参数为该类型指定新名称

我想你想要的是:

typedef struct test { int a; }  (Missing Second Parameter!) ;

现在,您使用了一个带有单个字段(
a
)的结构,并将其命名为
test

我将
typedef
概念化为有效地使用两个参数:

typedef struct test { 
    int a;
} test;
(我知道这不是100%准确,但为了简单起见,这是一种有用的查看方式)

例如:

typedef "original type"  "new type";
在您的示例中:

typedef unsigned int HRESULT;
// HRESULT is a new type that is the same as an unsigned int.
您已经通过了第一个“param”,一个名为
test
struct
,但从未使用第二个参数为该类型指定新名称

我想你想要的是:

typedef struct test { int a; }  (Missing Second Parameter!) ;

现在,您已经获取了一个带有单个字段(
a
)的结构,并将其命名为
test

请参见下面的POWs答案,您缺少别名。@EricPostpischil根据答案,我怀疑它是否合法。我在上面遇到了错误gcc@user2202911:对不起,我只是针对最初的声明。初始声明是合法的C,但它不声明类型名称,因为名称所在的位置没有名称。当你问一些“无法编译”的问题时,你应该包括实际的编译器错误信息。我现在明白了。这是我不知道的C/C++中的一个差异。请参阅下面的POWs答案,您缺少别名。@EricPostpischil根据答案,我怀疑这是合法的C。我在上面遇到了错误gcc@user2202911:对不起,我只是针对最初的声明。初始声明是合法的C,但它不声明类型名称,因为名称所在的位置没有名称。当你问一些“无法编译”的问题时,你应该包括实际的编译器错误信息。我现在明白了。这是我不知道的C/C++中的一个差异。Microsoft文档不是关于C的权威文档。C标准实际上并不包含
typedef
的单独语法
typedef
与其他声明共享相同的语法,并且该语法实际上不需要声明符。根据C 2011(N1570)6.7 2,对声明符的要求实际上是一种约束,而不是形式语法的一部分:“除静态声明外的声明应至少声明一个声明符(函数参数或结构或联合的成员除外)、一个标记或枚举的成员。”Microsoft文档对C没有权威性。C标准实际上不包含
typedef
的单独语法
typedef
与其他声明共享相同的语法,并且该语法实际上不需要声明符。根据C 2011(N1570)6.7 2,对声明符的要求实际上是一种约束,而不是形式语法的一部分:“除静态声明外的声明应至少声明一个声明符(函数参数或结构或联合的成员除外)、一个标记或枚举的成员。”