C++ 使用多个标题和cpp文件帮助

C++ 使用多个标题和cpp文件帮助,c++,include,compiler-errors,linker-errors,function-declaration,C++,Include,Compiler Errors,Linker Errors,Function Declaration,我正在用DragonFireSDK制作一个应用程序,我想用.cpp和.h文件组织我的数千行应用程序 不过,我在做事情的时候会犯很多错误 所以我的app.cpp(main,必选)看起来像这样 代码: 现在我可能已经做错了什么,但这里还有更多。。。 我的AppMain.cpp、OnTimer.cpp等看起来像这样 (AppMain()等也是必需的函数) 代码: 非常感谢您的帮助 不要包含.cpp文件 C编译模型是每个函数精确定义一次,即在一个编译单元(即一个目标文件)中定义。您可以将每个源文件独立编

我正在用DragonFireSDK制作一个应用程序,我想用.cpp和.h文件组织我的数千行应用程序

不过,我在做事情的时候会犯很多错误

所以我的app.cpp(main,必选)看起来像这样

代码:

现在我可能已经做错了什么,但这里还有更多。。。 我的AppMain.cpp、OnTimer.cpp等看起来像这样 (AppMain()等也是必需的函数) 代码:

非常感谢您的帮助

不要包含.cpp文件

C编译模型是每个函数精确定义一次,即在一个编译单元(即一个目标文件)中定义。您可以将每个源文件独立编译成一个单独的目标文件(
#包括
-ing头文件,以便编译器知道要使用的函数的原型)。然后将这些单独的对象文件链接在一起,形成最终的可执行文件

如果
#include
包含.cpp文件,最终将在多个编译单元中定义相同的函数(请记住
#include
基本上等同于将内容复制粘贴到执行包含操作的文件中)。因此,链接器会感到困惑,并将您看到的消息提供给您

更新

哦,我发现问题是您没有相应的
Functions.cpp
头文件。您还可以编写一个
Functions.h
,大致如下:

#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_

void SavePlayerMoney();
void SetInfo(int idnum, bool actuallyset);
void SwitchButton(int idnum, bool makeactive);
void DisableButton(int idnum);

#endif

然后您将
#包含此头文件,而不是.cpp文件。

链接器会抱怨,因为函数定义了多次。函数只能在一个翻译单元中定义(cpp文件,编译后成为obj文件)-除非声明为
inline

您将
Functions.cpp
包含在其他单元中,因此
function.cpp
中的函数定义会复制到这些单元中,从而导致链接器出现问题

解决方案是将函数声明为
inline
——或者更好的是,在头中声明它们(即
functions.h
),并在
functions.cpp
中定义它们。然后,这些函数的任何用户都可以
#包括functions.h
,并可以访问这些函数,即使他们不知道这些函数的实现


要声明函数,请执行:
intfoo(),要真正定义它,请执行
intfoo(){您的代码在这里}。

将函数声明移动到头文件。例如,函数.h应该包含:

#ifndef FUNCTIONS_H
#define FUNCTIONS_H

//SOME FUNCTIONS
void   SavePlayerMoney();
void   SetInfo            (int idnum, bool actuallyset = false);
void   SwitchButton       (int idnum, bool makeactive=true);
void   DisableButton      (int idnum);
double round              (double number);

#endif
然后Functions.cpp可以只包含Functions.h而不是那些声明。某些头文件可能需要包含其他头文件才能获得适当的类型


<> P>最后,绝不>代码>包含< /Calp> A*.CPP文件。

< P>我认为每个人都回答得很好,所以我将给你C++的大项目哲学,因为它看起来是你可能会发现有用的信息。 始终将函数声明和实现分开。 这会让你的生活变得更轻松。在.h文件中声明函数原型,然后在.cpp文件中编写实现

例如:

// mystuff.h
#ifndef MYSTUFF_H
#define MYSTUFF_H

int myFunction(int value, char letter);

#endif
在我的.cpp文件中:

// mystuff.cpp

#include "mystuff.h"

int myFunction(int value, char letter) {
    // insert implementation here
}
为什么要这样做?一个很好的原因是,当你的代码不能工作时(表面上是这样,这是任何程序员都无法逃避的现实),你可以用替代的实现替换掉你的.cpp文件,而不用修改你的代码结构。不仅如此,您还将发现许多依赖于分离声明和实现的技巧,这些技巧将大大简化您的工作。底线是,去做

尽可能尝试封装。 如果你正在做一个大项目(你会注意到这对于你遇到的大多数大项目来说都是如此),封装类似的函数、变量等将为你节省大量的时间和精力。看起来你正在制作一个程序来玩一个游戏-你有没有想过将每个玩家封装到一个玩家或人类类中,每个人都有特定于类的函数?如果你是一个C++或者java Junki,就像我自己一样,你会发现面向对象的方法是100个99次中最有效的方法(1%的情况通常是你有帮助函数不适合你所定义的任何对象)。p> 此外,封装使您能够利用面向对象设计的另外两个基本原则—多态性和继承。例如,您可以定义一个玩家类,然后如果您的游戏涉及一个计算机玩家和一个人类玩家,那么您可以为每个玩家编写一个单独的类,该类继承玩家的基本功能,但以不同的方式实现玩家的每个功能(也就是说,如果有一个makeMove函数,你将有一个不同于计算机的人类实现。因此,继承极大地简化了你的工作)。显然,OO设计有许多吸引人的品质,但就我从你的代码中收集到的,我想说你将从这些品质中获益最大


很明显,这是我自己的哲学,我不想强加于人。但希望你能从我的简短闲谈中得到一些有用的提示,以改进你编写代码的方式和/或避免一长串错误。祝你好运!

那么我该怎么处理它们呢,它们有应用程序和AppMain所需的功能。cpp我只是改变一下吗e扩展名还是什么?@Mark:Only
#包括头文件(实际上,只包括相关的头文件)。至于如何将这些链接在一起,这取决于您如何构建项目。如果您使用的是IDE,它通常只会为您处理这些。如果您在命令行中使用GCC,则需要类似于
g++file1.cpp file2.cpp-o my_app
。正如我在下面所说,我在哪里包括函数。cpp?@Mark
1>AppMain.obj : error LNK2005: "void __cdecl SwitchButton(int,bool)" (?SwitchButton@@YAXH_N@Z) already defined in App.obj
1>AppMain.obj : error LNK2005: "double __cdecl round(double)" (?round@@YANN@Z) already defined in App.obj
1>AppMain.obj : error LNK2005: "void __cdecl SetInfo(int,bool)" (?SetInfo@@YAXH_N@Z) already defined in App.obj
1>AppMain.obj : error LNK2005: "int __cdecl Digits(int)" (?Digits@@YAHH@Z) already defined in App.obj
#ifndef FUNCTIONS_H_
#define FUNCTIONS_H_

void SavePlayerMoney();
void SetInfo(int idnum, bool actuallyset);
void SwitchButton(int idnum, bool makeactive);
void DisableButton(int idnum);

#endif
#ifndef FUNCTIONS_H
#define FUNCTIONS_H

//SOME FUNCTIONS
void   SavePlayerMoney();
void   SetInfo            (int idnum, bool actuallyset = false);
void   SwitchButton       (int idnum, bool makeactive=true);
void   DisableButton      (int idnum);
double round              (double number);

#endif
// mystuff.h
#ifndef MYSTUFF_H
#define MYSTUFF_H

int myFunction(int value, char letter);

#endif
// mystuff.cpp

#include "mystuff.h"

int myFunction(int value, char letter) {
    // insert implementation here
}