我正在使用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来解决这个问题,但我想避免这种情况,因为代表的更复杂的程序需要变量可编辑。
答案 0 :(得分:2)
您需要确保包含的头文件只编译一次 - 您的代码将至少编译两次constants.h,因为它包含在functions.h和main.cpp中。为了保证这一点,在每个.h文件的开头放置语句:
#pragma once
请注意,虽然被编译器广泛接受,但上述内容是非标准选项。如果要采用标准支持的解决方案,可以使用宏/预处理器指令,如下所示:
#ifndef __CONSTANTS_H
#define __CONSTANTS_H 1
//
const double pie = 3.14;
//
#endif