Почему эта структура не компилируется?

Файл.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 ответа

Решение

С не имеет bool тип, поэтому объявляя ваши две переменные как bool не сработает В этом предыдущем потоке рассматриваются различные параметры для логических значений в C, хотя при использовании C99 это опция, которую можно исправить, добавив в нее следующее:

#include <stdbool.h>

У вас есть вещи не в порядке. Сначала вам нужно определить (или хотя бы объявить) свою структуру, затем вы можете использовать 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 как неполный тип для клиента кода, поэтому он не может связываться с содержимым, но кажется (по крайней мере для меня) немного менее вероятным, чтобы читатель был полностью сбит с толку тем, что вы делаете.

Другие вопросы по тегам