0

嗨,我不知道如何问这个问题我已经做了相当多的查找,但结果却是空的;所以如果这已经过去了,我必须道歉。我正在做我的第一个 c++ 项目,这很有趣。编译代码时出现重新定义错误。该项目由 3 个主文件组成,每个文件都有自己的头文件和一个它们都使用的通用头文件。我希望我的其他文件能够访问这个类,所以我在公共头文件中声明了它。我在警卫中写道,所以我认为这可以避免这个错误,但事实并非如此,我不明白为什么。

这是有问题的两个头文件。

菜单.h


#ifndef MENU_H
#define MENU_H
#include "common.h"
class menu
{
   int x, y, iterations, time;
   void title(int maxX, int maxY);
   void titleSplash();
   void fall(bool, int&, int, int);

public:
menu();
void init();
int score;
void gameOver(int how);
void mainMenu();



};



#endif

常见的.h


#ifndef COMMON_H
#define COMMON_H
   //things that all files need
        #include <curses.h>
        #include <string.h>
        #include <cstring>
        #include <cstdlib> //for debugging
        #include <unistd.h>
        #include <iostream>


        //using namespace std;

        #ifdef _WIN32//are we running windows?

        #define _WIN32_WINNT 0x0600
        #define CLOCK 2//only used for the opening animaitons repalaces clock
        #define SLEEP(a) sleep(a);//in 1000s of a second
        #include "WIN32.h"
        #endif

        #ifndef _WIN32

        #define CLOCK 8
        #define SLEEP(a) usleep( a * 1000);//in 1 000 000s of a second// replaces CLOCK

        #endif

        #define TIMER 17 //for about 60 times a second rounding up form 16.666666

     #ifndef MAIN_H
        #ifndef NON_MAIN_COMMON
        #define NON_MAIN_COMMON

        //common things that i dont want to put in each header file




    #endif

#endif
//everything else if after here including everything common.cpp
//------------------------------------------------------------------------------------------

//anything in myLib MUST be externed to avoid multiple definitions error
#ifndef MYLIB_H
extern void getStdScr();
extern int stdx, stdy, score;
extern WINDOW * win;
extern void ncursesInit();
extern void wrapper();
extern void newGame();
extern std::string keyPress();
extern void bclear(WINDOW * window);
#endif

#ifndef MENU_H
class menu
{
public:
menu();
void init();
int score;
void gameOver(int how);
void mainMenu();
};
#endif

//end of myLib


#endif
//EOCOMMON

我认为 menu.h 和 common.h 中的守卫会阻止重新定义我的菜单类。

4

2 回答 2

1

您从发布的代码中收到多个定义错误的原因并不明显。但答案很简单。不要定义类菜单两次。我不明白你为什么这样做。你觉得它有什么好处?只需将它放在 common.h 或 menu.h 中一次,就可以了。

当您说“该项目由 3 个主文件组成,每个主文件都有自己的头文件和一个共同使用的头文件”时,您似乎误解了头文件的作用。但是头文件中的所有内容都是通用代码。这就是头文件的用途。所以我的选择是将类菜单放在 menu.h 中,然后在需要的地方包含 menu.h。

于 2012-08-10T17:11:42.750 回答
0

如果你多次定义一个类,你会从你的 common.h 中丢失#define MENU_H(以及),你每次都需要整个警卫,而不仅仅是部分。#define MYLIB_H#ifndef MENU_H

此外,您应该使用#include "menu.h", 和,而不是再次定义菜单类#include "mylib.h"。如果 2 标头都包含另一个标头,则这不是错误,前提是两者都需要先定义另一个标头,但显然情况并非如此。

PS:有一个#else,所以代替

#ifdef _WIN32
  // for windows
#endif
#ifndef _WIN32
  // for anything else
#endif

你可以写:

#ifdef _WIN32
  // for windows
#else
  // for anything else
#endif
于 2012-08-10T18:02:38.317 回答