C ++ mutlipule .cpp文件错误c2374

时间:2013-04-29 22:49:36

标签: c++ linker-errors

我正在使用winapi图形包装器,我遇到了c2374错误“重新定义;多次初始化”。我制作了一个非常简化的程序来说明我的问题,我希望有人可以帮我解决这个问题。注意:此处的代码仅用于说明问题,这就是为什么您没有看到级联的包含。

的main.cpp

#include <iostream>
#include "functions.h"
#include "constants.h"


void main()
{
}

/////////////////////////////////////////////// /////////////////////////////

functions.h

#include "constants.h"

functions.cpp

#include "functions.h"

/////////////////////////////////////////////// /////////////////////////////

constants.h

double pie = 3.14;

constants.cpp

#include "constants.h"

/////////////////////////////////////////////// /////////////////////////////

错误是;错误C2374:'pie':重新定义;多次初始化

正如你在这个例子中看到的那样,我不是要编辑饼图或做其他事情,除了能够从不同的地方引用常量。在我的图形包装中,我试图得到一个HRESULT结果;定义,以便我可以简单地测试我初始化directx或sprite等时的失败。小请求:如果你有一个答案,请指向一个好的教科书,以了解多个文件编程或其他东西,我实际上是教学我自己一切,买不起课。谢谢。

进展:

头文件现在包含一个新的代码块

#ifndef //stuff//
#def    //stuff//

//code

#endif

每个都有自己独特的标签。错误更改为LNK2005:已经在constants.obj中定义了“double pie”(?pie @@ 3NA)。

注意:虽然有人建议使用const来解决这个问题,但我想避免这种情况,因为代表的更复杂的程序需要变量可编辑。

1 个答案:

答案 0 :(得分:2)

您需要确保包含的头文件只编译一次 - 您的代码将至少编译两次constants.h,因为它包含在functions.h和main.cpp中。为了保证这一点,在每个.h文件的开头放置语句:

#pragma once

请注意,虽然被编译器广泛接受,但上述内容是非标准选项。如果要采用标准支持的解决方案,可以使用宏/预处理器指令,如下所示:

#ifndef __CONSTANTS_H
#define __CONSTANTS_H 1
//
const double pie = 3.14;
//
#endif