非常简单的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,对声明符的要求实际上是一种约束,而不是形式语法的一部分:“除静态声明外的声明应至少声明一个声明符(函数参数或结构或联合的成员除外)、一个标记或枚举的成员。”