c++ - 使用多个头文件和 cpp 文件帮助

标签 c++ include compiler-errors linker-errors function-declaration

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

虽然我在尝试做某事时遇到了很多错误

所以我的 app.cpp(主要的,必需的)看起来像这样

代码:

#include "DragonFireSDK.h"

#include "SaveData.h"
#include "Structures.h"
#include "Definitions.h"
#include "Variables.h"
#include "SaveData.h"

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "Functions.cpp"
#include "AppMain.cpp"
#include "AppExit.cpp"
#include "OnTimer.cpp"

#include "SaveData.h"到 #include "Variables.h" 都有类似的东西 代码:

#ifndef _HeaderName
#define _HeaderName
//STUFF HERE LIKE
#define player1 0
#define player2 1
//OR
typedef struct _number {
    int view;
    int number;
    bool able;
    int opacity;
};_number number[4];
//OR
int whoseturn;

int bet[5];
bool reachedmax[5];

int playerimg[5];
#endif

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

#include "DragonFireSDK.h"
#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "Definitions.h"
#include "Structures.h"
#include "Variables.h"
#include "SaveData.h"

#include "Functions.cpp"

void AppMain() {
//STUFF HERE
};

现在我认为这是问题所在...... 函数.cpp 代码:

#include "DragonFireSDK.h"

#include <time.h>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#include "SaveData.h"
#include "Structures.h"
#include "Definitions.h"
#include "Variables.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);

void SavePlayerMoney() {
    //...
}
void   SetInfo(int idnum, bool actuallyset) {
      //...
}
void   SwitchButton(int idnum, bool makeactive) {
      //...
}
void   DisableButton(int idnum){
      //...
}

现在我想如果修复了所有的东西之后我得到的错误...... 代码:

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

非常感谢任何帮助!

最佳答案

不要#include.cpp 文件。

C 编译模型是每个函数都定义 恰好一次,即恰好在一个编译单元(即一个目标文件)中。您将每个源文件独立编译成一个单独的目标文件(#include-ing header 文件,以便编译器知道例如要使用的函数的原型(prototype))。然后,您将这些单独的目标文件链接在一起以形成最终的可执行文件。

如果您#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

然后你#include this 头文件,而不是 .cpp 文件。

关于c++ - 使用多个头文件和 cpp 文件帮助,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5573964/

相关文章:

PHP:包含为没有输出缓冲的字符串?

php - 如何使用 PHP include 保留路径结构?

python - 用 Pandas 导入数据时卡住了错误

url - 如何在C++程序中打开URL

c++ - 为什么使用整数类型约束 auto 使其不可用于 views::filter?

c++ - std::vector<double> 缩小以适应?

c++ - 使用 Bison 解析简单 C 源代码的问题

c++ - 检查/修改迭代器 "constness"

c++ - 为什么我们使用 `#include "stdafx.h "` instead of ` #include <stdafx.h>`?

c++ - 声明结构图时如何解决编译错误?