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要查看失败,您必须了解#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”之前