为什么这个结构不编译?

时间:2013-06-11 02:39:56

标签: 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 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

我所知道的就是检查网络上的语法。这看起来像是没有骨头的。我做错了什么?

2 个答案:

答案 0 :(得分:1)

你有事情不按规定。首先,您需要定义(或至少声明)您的结构,然后您可以使用typedef为该名称创建别名。无论如何,你的标题都是无用的(当/你在某处包含那个标题时,不足以使typedef编译)。我会安排这样的标题:

#ifndef _WORTHLESS_LIB_H_
#define _WORTHLESS_LIB_H_

struct somestuff
{
    bool didOne;
    bool didTwo;
};

typedef struct somestuff stuff_type;

#endif

这应该编译(即,当您尝试在typedef中使用struct somestuff时,名称已知),这使得标头可用。

如果你在C中使用它(而不是C ++),则需要使用_Bool作为成员的类型,或者#include <stdbool.h>来获取bool定义为_Bool的别名,这是该语言内置的布尔值的名称。假设C99或更新 - 一个较旧的(C89 / 90)编译器,您需要完全自己定义bool

编辑:糟糕 - 评论非常正确。在typedef中使用它之前,您不需要声明/定义名称,因此不需要在标头中放置struct定义。就个人而言,我认为无论如何我都会先声明它,所以标题看起来像是:

struct somestuff;

typedef struct somestuff stuff_type;

这使得somestuff作为代码客户端的不完整类型,因此它们不会弄乱内容,但似乎(至少对我来说)不太可能让读者完全糊涂在你正在做什么。

答案 1 :(得分:1)

C没有bool类型,因此将两个变量声明为bool将无法正常工作。之前的thread用于C中布尔值的各种选项,但如果使用C99是一个选项,那么简单的修复就是添加这个包括:

#include <stdbool.h>