.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
我所知道的就是检查网络上的语法。这看起来像是没有骨头的。我做错了什么?
答案 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>