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