C 为什么不是';这不是结构编译吗?

C 为什么不是';这不是结构编译吗?,c,struct,C,Struct,.h文件: #ifndef _WORTHLESS_LIB_H_ #define _WORTHLESS_LIB_H_ typedef struct somestuff stuff_type; #endif .c文件: #include "WorthlessLib.h" struct somestuff { bool didOne; bool didTwo; }; 当我开始编译时,我得到以下输出: Error 1 error C2016: C requires th

.h文件:

#ifndef _WORTHLESS_LIB_H_
#define _WORTHLESS_LIB_H_

typedef struct somestuff stuff_type;

#endif
.c文件:

#include "WorthlessLib.h"

struct somestuff
{
    bool didOne;
    bool didTwo;
};
当我开始编译时,我得到以下输出:

Error   1   error C2016: C requires that a struct or union has at least one member  e:\users\robert\documents\visual studio 2012\projects\worthlesslib\worthlesslib\worthlesslib.c  8   1   WorthlessLib
Error   2   error C2061: syntax error : identifier 'bool'   e:\users\robert\documents\visual studio 2012\projects\worthlesslib\worthlesslib\worthlesslib.c  8   1   WorthlessLib
Error   3   error C2061: syntax error : identifier 'didTwo' e:\users\robert\documents\visual studio 2012\projects\worthlesslib\worthlesslib\worthlesslib.c  9   1   WorthlessLib
Error   4   error C2059: syntax error : ';' e:\users\robert\documents\visual studio 2012\projects\worthlesslib\worthlesslib\worthlesslib.c  9   1   WorthlessLib
Error   5   error C2059: syntax error : '}' e:\users\robert\documents\visual studio 2012\projects\worthlesslib\worthlesslib\worthlesslib.c  11  1   WorthlessLib

我所知道要做的就是检查网络上的语法。这似乎是赤裸裸的。我做错了什么?

你把事情搞乱了。首先需要定义(或至少声明)结构,然后可以使用typedef为该名称创建别名。你的头是非常无用的,因为它仍然存在(没有包含足够的typedef编译时/如果你在某处包括该头)。我会这样安排标题:

#ifndef _WORTHLESS_LIB_H_
#define _WORTHLESS_LIB_H_

struct somestuff
{
    bool didOne;
    bool didTwo;
};

typedef struct somestuff stuff_type;

#endif
这应该进行编译(即,当您尝试在typedef中使用
struct something
时,名称已为人所知),以使标题可用

如果您在C中使用它(与C++相反),您需要使用
\u Bool
作为成员的类型,或者
\include
Bool
定义为
\u Bool
的别名,这是内置于语言中的布尔名称。假设C99或更高版本——一个旧的(C89/90)编译器,您需要完全自己定义
bool

编辑:哎呀,评论很对。在typedef中使用名称之前,实际上不需要声明/定义名称,因此无需将
struct
定义放在标题中。就我个人而言,我想我还是先声明它,所以标题看起来像:

struct somestuff;

typedef struct somestuff stuff_type;

这使得
somestuff
对于代码的客户端来说是一个不完整的类型,因此它们不会弄乱内容,但(至少对我来说)似乎不太可能让读者完全困惑于您所做的事情。

C没有
bool
类型,因此将两个变量声明为
bool
是行不通的。前面介绍了C中布尔值的各种选项,尽管如果使用
C99
是一个选项,简单的修复方法是添加以下内容:

#include <stdbool.h>
#包括

将结构粘贴到typedef上方也会产生相同的结果。大概整个要点是对标题用户隐藏结构类型的详细信息。同样地,原始版本也很好。有趣的是,typedef至少在VS2012中按照所给出的顺序编译得很好。问题是bool,由另一个typedef和#defined处理。bool在C中不是有效的类型。哦,天哪。。。是的,永远都是,谢谢。bool在C89中不是有效的类型,在C99中完全有效。如果OP使用的是gcc,只需添加标志
std=c99
并添加到您的代码
#include
,您就可以支持bool。挑剔:对于任何其他编程语言,如果您不提及版本号,则假定为最新的稳定版本。那么为什么C通常被解释为C89而不是C11(或者至少是C99)?让我们停止那样做吧。您的第一句话应该是“C89没有bool类型”。之所以假定C89为@Will,是因为MSVC只支持C89,错误消息来自MSVC。这不是一个很好的理由,但它需要的知识比一般初学者必须知道的要多。@JonathanLeffler,这很公平。。。。但是这样的话还是可以告诉初学者:“您使用的MSVC编译器只支持旧的C89标准版本的C。C89没有布尔类型。”。也许C程序员早一点放弃MSVC可能比晚一点要好。@JonathanLeffler这是关于提到版本的一个有趣的观点,我必须更多地考虑它。我认为大多数编译器默认使用某种风格的
C89
,有没有默认使用
C99