我从compilator那里得到了这个错误:
1>Linking...
1>main.obj : error LNK2005: "int g_win_flags" (?g_win_flags@@3HA) already defined in init.obj
1>main.obj : error LNK2005: "struct SDL_Surface * g_screen" (?g_screen@@3PAUSDL_Surface@@A) already defined in init.obj
1>MSVCRTD.lib(cinitexe.obj) : warning LNK4098: defaultlib 'msvcrt.lib' conflicts with use of other libs; use /NODEFAULTLIB:library
1>.\Debug\Heroes are back!.exe : fatal error LNK1169: one or more multiply defined symbols found
看起来g_win_flags和g_screen两次都包括在内,但我不明白为什么。 这是来源:
的main.cpp
#include <iostream>
#include "dec.h"
#include "init.h"
int main(int argc, char *argv[]){
init();
return 0;
}
dec.h
#ifndef DEC_H
#define DEC_H
#include <SDL.h>
#include <iostream>
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
using namespace std;
int g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
SDL_Surface *g_screen = NULL;
#endif
init.h里
#ifndef INIT_H
#define INIT_H
bool init();
#endif
init.cpp
#include "dec.h"
bool init(){
if (SDL_Init(SDL_INIT_VIDEO | SDL_INIT_AUDIO | SDL_INIT_TIMER) == -1){
cerr << "Unable to initialize SDL" << endl;
return false;
}
g_screen = SDL_SetVideoMode(640, 480, 0, g_win_flags);
return true;
}
有人可以帮忙吗?在此先感谢您,祝您度过愉快的一天:)
答案 0 :(得分:3)
您可以在标题中定义和初始化变量。
你应该在头文件(dec.h)中声明它们而不使用任何初始化器:
extern int g_win_flags;
extern SDL_Surface *g_screen;
然后在一个文件中定义它们 - 大概是dec.cpp - 用初始化。
实际上,你是在每个包含'dec.h'的源文件中定义它们,然后违反ODR - 一个定义规则。
答案 1 :(得分:2)
extern int g_win_flags;
extern SDL_Surface *g_screen;
然后在dec.cpp
中定义和初始化它们<强>更新强>
#include "dec.h"
int g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
SDL_Surface *g_screen = NULL;
一般的经验法则是“头文件中的任何内容都不应占用编译器输出中的任何空间”。 (显然有例外)
实际上,这意味着外部变量声明很好,函数声明也是如此,但不是定义。
答案 2 :(得分:0)
您已将文件包含在两个定义实例化变量的源文件(init.cpp和main.cpp)中。
你需要一种方法来确保除了一个源文件外,它们都被“驱逐”。
答案 3 :(得分:0)
好吧,我试着做你告诉我们的人,但是编译器在抱怨:
1>.\heroes are back!\dec.cpp(2) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\heroes are back!\dec.cpp(4) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>.\heroes are back!\dec.cpp(4) : error C2040: 'g_screen' : 'int' differs in levels of indirection from 'SDL_Surface *'
这是dec.h
#ifndef DEC_H
#define DEC_H
#include <SDL.h>
#include <iostream>
#pragma comment(lib, "SDL.lib")
#pragma comment(lib, "SDLmain.lib")
using namespace std;
extern int g_win_flags;
extern SDL_Surface *g_screen;
#endif
dec.cpp
#include "dec.h"
g_win_flags = SDL_HWSURFACE|SDL_DOUBLEBUF;
g_screen = NULL;
此代码有什么问题?很抱歉提出愚蠢的问题,但我只是在学习C ++:)