C ++ глобальная переменная в нескольких файлах

0

У меня есть кнопка класса, которая включает в себя класс ButtonManager, который управляет кнопками.

Тогда у меня есть 2 функции, которые обрабатывают вещи, 1 - это окно входа в систему с несколькими кнопками, второе - это меню игры, в котором также есть кнопки.

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

Проблема в том, что мне нужно включить класс кнопки в.cpps и main, а вторичный cpp также включает в себя некоторый dummy.h который содержит объявление общей функции, отображающей меню.

Основная проблема заключается в том, что ButtonManager имеет глобальную переменную, и при компиляции он говорит, что символ уже определен.

Пример кода:

ah (действует так, как если бы это был заголовочный файл Button Manager):

#ifndef _ABC_
#define _ABC_

struct A{
    int b;
}a = A();

#endif

side.h (скажем, это для основного игрового окна):

#ifndef _SIDE_H_
#define _SIDE_H_

int callSomething();

#endif    //_SIDE_H_:

side.cpp:

#include "side.h"
#include "abc.h"

#include <iostream>

int callSomething()
{
    std::cout << a.b << "\n";
    return a.b;
}

main.cpp:

#include "abc.h"
#include "side.h"
#include <iostream>

int main()
{
    callSomething();
    std::cin.get();
}

Когда я пытаюсь скомпилировать его, компилятор жалуется:

1>side.obj: error LNK2005: "struct A a" (?a@@3UA@@A) already defined in DynamicDispatch.obj 1>H:\Microsoft Visual Studio 11.0\example\Debug\dynamicdispatch.exe: fatal error LNK1169: one or more multiply defined symbols found

Вся помощь приветствуется

  • 0
    Я нашел и знаю о ключевом слове extern , но как применить ключевое слово extern к переменной, определенной таким образом? Я только зашел так далеко, что если я #include "abc.h" из main.cpp он работает, но тогда я не могу использовать struct A в main.cpp
Теги:
visual-studio-2012

1 ответ

4
Лучший ответ

В ah объявить переменную as

struct A{
    int b;
};
extern struct A a;

Затем в main.cpp определите его один раз:

struct A a;
int main()
{
    //...
}
  • 0
    спасибо, это работает, даже если бы я думал, что было бы возможно, чтобы это было напечатано только один раз, но кажется, что это невозможно; редактировать: у вас есть опечатка в main хе-хе
  • 0
    @ 0x499602D2 я это исправил. это сказал mian
Показать ещё 1 комментарий

Ещё вопросы

Сообщество Overcoder
Наверх
Меню