我正在用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识别为类型名称。
答案 0 :(得分:2)
循环依赖性!假设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
需要{{ 1}}来自lista
。因此,我们还要添加一个前向声明。有关更多信息,请参见this link。您的最终代码将是:
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
答案 1 :(得分:1)
如果要在B.h中使用在A.h上声明的内容,则需要在B.h中包括A.h。因此,需要在lista.h
中包含login.h
。
答案 2 :(得分:0)
在login.h中包括lista.h,因为您的登录标头需要访问lista:)
答案 3 :(得分:0)
您的问题归结为:
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;
};