C++ 编译错误 C2146 和 C4430

Posted

技术标签:

【中文标题】C++ 编译错误 C2146 和 C4430【英文标题】:C++ compile error C2146 and C4430 【发布时间】:2016-01-14 00:43:11 【问题描述】:

编译器显示 2 个错误: C2146 - 语法错误:缺少 ';'在标识符“开始”之前 C4430 - 缺少类型说明符 - 假定为 int。注意:C++ 不支持默认整数 我的"Globals.h" 文件第 5 行出现错误。 在这里:

#pragma once
#include "Load.h"
#include "SortStream.h"

extern Load begin;
extern int sort_by;
extern int sort_type;
extern vector<Flight> all_flights;
extern SortStream sort_stream;

我的"Globals.cpp" 文件如下所示:

#include "Globals.h"

Load Begin;
int sort_by;
int sort_type;
vector<Flight> all_flights;
SortStream sort_stream;

还有,这里是"Load.h" 文件:

#pragma once
#include <vector>
#include "Flight.h"
#include "Globals.h"
using namespace std;

class Load 
    std::string path;
    vector<Flight> allFlights;
public:
    Load();

   std::string get_path();
   vector<Flight> get_allFlights();

   void set_path(std::string p);
   void set_allFlights(vector<Flight> v);

   void load_flights();
;

还有"SortStream.h"文件:

#pragma once
#include <vector>
#include "Flight.h"
using namespace std;
class SortStream 
    vector< vector < Flight > > layout;
    int switchNum;
    int iterationNum;
    int compareNum;
public:
    SortStream();
    vector< vector < Flight > > get_layout();
    int get_switchNum();
    int get_iterationNum();
    int get_compareNum();
    void set_layout(vector< vector < Flight > > v);
    void set_switchNum(int n);
    void set_iterationNum(int n);
    void set_compareNum(int n);
;

有人知道原因吗?提前通知

【问题讨论】:

sortstream.h 中可能有问题。当包含一个文件时,它只是逐字删除,所以如果 .h 文件的末尾有一些奇怪的东西,编译器直到包含文件中的后续行才能真正确定它是错误的。但是,如果没有看到 sortstream.h,我无法告诉你真正的问题是什么。 global.h 包含 load.h,而在 load.h 中您包含 global.h。那是行不通的。 @xaxaon 我编辑了帖子,这里是“SortStream.h”文件 仅使用 gcc -E 标志通过预处理器运行它。看一下在 Global.h:5 上使用 Load 之前是否定义了它我没有看到任何明显错误 我删除了 Flight.h 和 Flight 类的所有引用(因为你没有提供它),在一个地方添加了一个 #include 并用 gcc -c Globals 编译它就好了.cpp 【参考方案1】:

要查看失败,您必须了解#includes 的工作原理。每个#include被包含文件的副本替换。

查看 Load.h

#pragma once
#include <vector> <-- paste vector in here
#include "Flight.h" <-- paste Flight.h in here
#include "Globals.h" <-- paste Globals.h in here
using namespace std;

class Load 
    std::string path;
    vector<Flight> allFlights;
public:
    Load();

   std::string get_path();
   vector<Flight> get_allFlights();

   void set_path(std::string p);
   void set_allFlights(vector<Flight> v);

   void load_flights();
;

让我们粘贴到 Globals.h 中看看会发生什么:

#pragma once
#include <vector> <-- paste vector in here
#include "Flight.h" <-- paste Flight.h in here
//Globals.h begins here
#pragma once
#include "Load.h" <-- would paste Load.h in here, but it's protected by #pragma once 
                      and will not be pasted in again
#include "SortStream.h" <-- paste SortStream.h in here

extern Load begin;
extern int sort_by;
extern int sort_type;
extern vector<Flight> all_flights;
extern SortStream sort_stream;

// end of Globals.h
using namespace std; <-- off topic: Very dangerous thing to do in a header

class Load 
    std::string path;
    vector<Flight> allFlights;
public:
    Load();

   std::string get_path();
   vector<Flight> get_allFlights();

   void set_path(std::string p);
   void set_allFlights(vector<Flight> v);

   void load_flights();
;

在这种情况下,我们可以看到 Load begin; 在定义 Load 之前被引用。轰隆隆。

循环引用几乎总是不好的,在这种情况下,它是致命的。换句话说,Tarik Neaj 获胜。

Load.h 不需要 Globals.h 中定义的任何内容,因此删除包含以打破循环。

【讨论】:

以上是关于C++ 编译错误 C2146 和 C4430的主要内容,如果未能解决你的问题,请参考以下文章

错误:C2146:语法错误:缺少“;”在标识符“m_Employer”之前,

声明Windows API结构(DCB)的对象 - 错误C4430:缺少类型说明符 - 假定为int

C++ 和 Visual Studio 2017:错误 c4430 [重复]

错误 C2146:语法错误:缺少“;”在标识符“ContextRecord”之前

错误 C2146:语法错误:缺少“;”在标识符 'm_ball' C++、MFC 之前

错误 C4430:缺少类型说明符 - 假定为 int?