Я делаю многофайловый проект на C ++. У меня есть этот код:
Lista.h
struct elem
{
account info;
elem* next;
};
typedef elem* lista;
Ошибка показана здесь, где объявлено «lista * a».
Login.h :
struct account
{
string user = "";
int hash_pass = 0;
};
struct list
{
lista* a;
int size;
};
Login.cc :
#include "login.h"
#include "lista.h"
....
Lista.cc
#include "login.h"
#include "lista.h"
....
В lista.cc и login.cc я включил login.h и lista.h, но в login.h не распознает lista как имя типа.
4 ответа
Круговая зависимость! Предполагая, что тип string
четко определен где-то еще в заголовочных файлах (возможно, std::string
?), это потому, что вы включили файлы в неправильном порядке.
#include "login.h"
#include "lista.h"
....
Это в основном эквивалентно:
struct account
{
string user = "";
int hash_pass = 0;
};
struct list
{
lista* a;
int size;
};
struct elem
{
account info;
elem* next;
};
typedef elem* lista;
....
Как видите, lista
появляется еще до typedef
, поэтому вы получаете ошибку.
Очевидно, вам не нужно заботиться о том, в каком порядке вы включаете файлы заголовков, поэтому правильное решение здесь будет включать lista.h
в login.h
с надлежащими средствами защиты заголовков. Но этого недостаточно в этом случае : здесь есть круговая зависимость, поскольку lista.h
нуждается в struct account
от login.h
и login.h
нуждается в {{ X6}} из lista.h
. Поэтому мы также добавляем предварительную декларацию. Для получения дополнительной информации см. эту ссылку. Ваш окончательный код будет:
lista.h
:
#ifndef LISTA_H_
#define LISTA_H_
struct account; // forward declaration
struct elem
{
account* info; // notice that `account` now has to be a pointer
elem* next;
};
typedef elem* lista;
#endif
login.h
:
#ifndef LOGIN_H_
#define LOGIN_H_
#include "lista.h"
struct account
{
string user = "";
int hash_pass = 0;
};
struct list
{
lista* a;
int size;
};
#endif
Если вы хотите использовать что-то объявленное в A.h внутри B.h, вам нужно включить A.h в B.h. Следовательно, необходимо включить lista.h
в login.h
.
Ваша проблема сводится к следующему:
struct elem
{
account info; // <<< account is not known here
elem* next; // elem is not known here
};
typedef elem* lista;
struct account
{
std::string user = "";
int hash_pass = 0;
};
struct list
{
lista* a;
int size;
};
typedef elem* lista;
Если вы исправите порядок объявлений, он будет хорошо скомпилирован:
struct account
{
std::string user = "";
int hash_pass = 0;
};
struct elem
{
account info;
elem* next;
};
typedef elem* lista;
struct list
{
lista* a;
int size;
};
Включите lista.h в login.h, так как вам нужен заголовок для входа в lista :)
Новые вопросы
c++
C ++ - это язык программирования общего назначения. Первоначально он был разработан как расширение C и имеет аналогичный синтаксис, но теперь это совершенно другой язык. Используйте этот тег для вопросов о коде (который будет скомпилирован с помощью компилятора C ++). Используйте тег, зависящий от версии, для вопросов, связанных с конкретной редакцией стандарта [C ++ 11], [C ++ 14], [C ++ 17] или [C ++ 20] и т. Д.