我有一个任务,我必须使用不同的文件为我的功能,我不需要使用一个头文件。问题是编译器正在向我显示各种错误。对于我的所有函数,所有的错误都是完全相同的。
这是错误:
1 > 1> SortCompany.cpp 1>c:\users\emanuel\documents\visual studio 2013\projects\asignacion 1\asignacion 1\sortcompany.cpp(1):error C2065:'Elemento‘:未声明的标识符 1>c:\users\emanuel\documents\visual studio 2013\projects\asignacion 1\asignacion 1\sortcompany.cpp(1):error C2146:语法错误:缺失‘) 1>c:\users\emanuel\documents\visual studio 2013\projects\asignacion 1\asignacion 1\sortcompany.cpp(1):error C2182:'SortCompany‘:非法使用'void’类型 1>c:\users\emanuel\documents\visual studio 2013\projects\asignacion 1\asignacion 1\sortcompany.cpp(1):error C2059:语法错误:')‘ 1>c:\users\emanuel\documents\visual studio 2013\projects\asignacion 1\asignacion 1\sortcompany.cpp(2):error C2143:语法错误:缺失';‘{’之前‘ 1>c:\users\emanuel\documents\visual studio 2013\projects\asignacion 1\asignacion 1\sortcompany.cpp(2):error C2447:'{‘:缺少函数头(旧式正式列表?)
(所有档案的错误与上述相同.)
1>生成代码..。==========构建:0成功,1失败,0最新版本,0跳过==========
我有main.cpp,它是主文件(很明显)。主调用"Menu.cpp“,菜单调用其他文件中的所有其他函数。
PD: Elemento[]是一个结构
Menu.cpp代码:
using namespace std;
//these functions are fine
void Closing(ifstream &, ofstream &);
void Opening(ifstream &, ofstream &);
//the problem is here with all these functions
void Registro(Elemento[], int &, ifstream &);
void InfoDealer(Elemento[], int, ofstream &);
void SortCompany(Elemento[], int);
void MayorVentas(Elemento[], int, ofstream &);
void MayorVentasPorMarca(Elemento[], int, ofstream &);
#include "Registro.cpp"
#include "InfoDealer.cpp"
#include "SortCompany.cpp"
#include "MayorVentas.cpp"
#include "MayorVentasPorMarca.cpp"
void Menu()
{
//code here...
}
Registro.cpp:
void Registro(Elemento Dealer[], int &Cantidad, ifstream &entrada)
{
//code here...
}
main.cpp: (此文件为默认文件)。我不应该改变它。)
//include stuff
using namespace std;
const int MAXIMODEALERS = 20;
const int MAXIMOMODELOS = 6;
struct Detail
{
string ModelName;
int Sales;
};
typedef Detail Detalle;
struct Element
{
string CompanyName;
Detalle Modelo[MAXIMOMODELOS];
};
typedef Element Elemento;
Elemento Dealer[MAXIMODEALERS];
int Cantidad;
void Menu(void);
#include "Menu.cpp"
void Opening(ifstream &Entrada, ofstream &Salida)
{
//code
}
void Closing(ifstream &entrada, ofstream &salida)
{
//code
}
int main()
{
Menu();
return 0;
}
所有剩余的文件都具有与Registro.cpp相同的结构。
希望你能帮我!如果你需要更多的细节,请索取。
发布于 2014-02-05 17:49:23
您应该在使用类和结构之前转发-声明类和结构。在函数之前添加struct Elemento;
。无论如何,如果不至少在某个地方包含ifstream
,就不能使用ifstream
。
发布于 2014-02-06 05:19:41
在翻译单元中使用的每个名称必须首先声明,在使用它的语句之上。例如,函数Registro
使用的是名称Elemento
。编译器对此一无所知,因此必须首先在某个地方声明它以指定其类型。ifstream
和ofstream
也是如此。此外,我认为您正在尝试链接Menu.cpp
和其他文件中所有函数的定义。然后就有麻烦了,因为每个函数都有多个定义,一个定义是在include
中Menu.cpp
中定义的,另一个定义是在每个源文件中。当您将所有这些链接起来时,您将得到每个函数的两个定义。另外,请注意这是一个糟糕的设计。您不应该使用include
.cpp
文件。这是NOT
,因为不允许您这样做。预处理器不关心您是include
、.cpp
还是.abcdef
文件。它们都只是文本文件。有了这个,我的意思是你不应该在你的翻译单元中包括definitions
,因为它们会给你带来严重的头痛,这真的是你不能指望的糟糕的设计。这里有一个很好的解释如何组织您的代码。希望这能有所帮助!
需要补充的东西:
我看到你的评论。是的,Element
是main.cpp中的defined
(未声明)。但是,由于您是单独编译所有这些文件,编译器不知道在翻译单元unless
之外存在什么,所以指定它。因此,如果您在使用Element
之前不使用它,它就不会知道它的名称。我想你对翻译单位、预处理包括-s、链接、范围、存储时间等概念有一点了解。花点时间去读,一切都会变得更清晰。
https://stackoverflow.com/questions/21584542
复制相似问题