Ошибки множественного определения (LNK2005) - PullRequest
0 голосов
/ 29 декабря 2011

Я недавно пытался создать глобальный заголовочный файл, который имел бы все определения кодов ошибок (т.е. NO_ERROR, SDL_SCREEN_FLIP_ERROR и т. Д.), Это были бы просто целые числа, которые я определил бы здесь.

Я включил их воба моих файла .cpp, однако я получаю сообщение об ошибке, где указано, что я определяю затем дважды.

globals.h:

#pragma once

// error related globals
int SCREEN_LOAD_ERROR = 1;
int NO_ERROR = 0;

main.cpp:

#include "globals.h"
#include "cTile.h"
/* rest of the code */

cTile.h:

#pragma once
#include "globals.h"

class cTile {
};

Жалуется, что SCREEN_LOAD_ERROR и NO_ERROR определены дважды, но, насколько я знаю, однажды #pragma это должно предотвратить (я также пробовал #ifndef, ноэто также не работало).

вывод компилятора:

1> main.obj: ошибка LNK2005: "int SCREEN_LOAD_ERROR" (? SCREEN_LOAD_ERROR @@ 3HA) уже определено в cTile.obj 1>main.obj: ошибка LNK2005: «int NO_ERROR» (? NO_ERROR @@ 3HA) уже определено в cTile.obj

Я что-то упустил?

Ответы [ 3 ]

5 голосов
/ 29 декабря 2011

Не объявляйте переменные в вашем файле заголовка.
Когда вы объявляете переменную в файле заголовка, копия переменной создается в каждой единице перевода, куда вы включаете файл заголовка.

Решение:
Объявите их extern внутри одного из ваших заголовочных файлов и определите их точно в одном из ваших файлов cpp.

глобальные переменные.h:

extern int SCREEN_LOAD_ERROR;
extern int NO_ERROR;

globals.cpp:

#include "globals.h"
int SCREEN_LOAD_ERROR = 0;
int NO_ERROR = 0;

main.cpp:

#include "globals.h"

cTile.h:

#include "globals.h"
3 голосов
/ 29 декабря 2011

Вы можете просто использовать enum:

globals.h:

enum
{
    SCREEN_LOAD_ERROR = 1,
    NO_ERROR = 0,
    // ...
}
0 голосов
/ 29 декабря 2011

с использованием #ifndef работает нормально. (Хотя это работает, это не лучшая практика).попробуйте так:

globals.h

#ifndef GLOBALS
#define GLOBALS

int SCREEN_LOAD_ERROR = 1;
int NO_ERROR = 0;

#endif

cTile.h:

#include "globals.h"

class cTile {
};

main.cpp:

#include "globals.h"
#include "cTile.h"
/* rest of the code */
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...