不能在另一个文件中包含结构

时间:2018-08-20 08:48:51

标签: c++

我正在用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 个答案:

答案 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;
};