1

.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

我所知道的就是检查网络上的语法。这看起来很简单。我究竟做错了什么?

4

2 回答 2

1

你的事情不正常。首先,您需要定义(或至少声明)您的结构,然后您可以使用 typedef 创建该名称的别名。无论如何,您的标头几乎没有用(当/如果您在某处包含该标头时, typedef 没有足够的内容进行编译)。我会安排这样的标题:

#ifndef _WORTHLESS_LIB_H_
#define _WORTHLESS_LIB_H_

struct somestuff
{
    bool didOne;
    bool didTwo;
};

typedef struct somestuff stuff_type;

#endif

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

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

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

struct somestuff;

typedef struct somestuff stuff_type;

somestuff对于代码的客户端来说是一个不完整的类型,所以他们不能弄乱内容,但似乎(至少在我看来)不太可能让读者对你正在做的事情完全糊涂。

于 2013-06-11T02:41:45.220 回答
1

C 没有bool类型,因此将两个变量声明为bool不起作用。这个先前的线程进入了 C 中布尔值的各种选项,尽管如果 usingC99是一个选项,简单的解决方法是添加这个包括:

#include <stdbool.h>
于 2013-06-11T02:44:37.307 回答