Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 20.08.2009, 15:33   #1
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
Вопрос multiple definition

Вообщем компилятор пишет
pacman.o (.bss+0x0) : multiple definition of sc
main.o (.bss+0x0) : first definition here main.o


Он вообще о чём? Какие ещё множественные объявления. И так пишет на любую попытку объявления глобальной переменной в pacman.h

pacman.h
Код:
#ifndef PACMAN_H
#define PACMAN_H

#include "myscene.h"
#include <iostream>
#include <stdlib.h>
#include <cstdlib>
#include <time.h>
using namespace std;

MyScene *sc; 

#endif

pacman.cpp
Код:
#include "pacman.h"

extern MyScene *sc;
main.cpp
Код:
#include <QApplication>
#include "myform.h"
#include "pacman.h"
jojahti вне форума Ответить с цитированием
Старый 20.08.2009, 15:40   #2
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

2jojahti
гениально.
в pacman.h пиши extern MyScene *sc; , а в pacman.cpp - MyScene *sc; (т.е наоборот)
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 20.08.2009, 15:51   #3
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

pproger
Крута. Теперь компилится.

Эээээ... А почему наоборот?
И почему до этого ругалось?
jojahti вне форума Ответить с цитированием
Старый 20.08.2009, 15:54   #4
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Потому что pacman.h включён и в pacman.cpp и в main.cpp, то есть объявление переменной происходило два раза...
netrino вне форума Ответить с цитированием
Старый 20.08.2009, 16:02   #5
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Ну так заголовочный файл по идее и должен включаться в два.

Тоесть определение два раза происходило, ааа, теперь ясно.

Крута, теперь у меня сегментатион фаулт.
jojahti вне форума Ответить с цитированием
Старый 20.08.2009, 16:30   #6
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

Всё это круто, но с константами что мне делать?
jojahti вне форума Ответить с цитированием
Старый 20.08.2009, 16:40   #7
pproger
C++ hater
СтарожилДжуниор
 
Аватар для pproger
 
Регистрация: 19.07.2009
Сообщений: 3,333
По умолчанию

Цитата:
Крута, теперь у меня сегментатион фаулт.
небось используешь не инициализированный указатель

Цитата:
Всё это круто, но с константами что мне делать?
ну я с ними обычно работаю, что тебе с ними делать - реши сам) с КАКИМИ (пииии) константами?
I invented the term Object-Oriented, and I can tell you I did not have C++ in mind. (c)Alan Kay

My other car is cdr.

Q: Whats the object-oriented way to become wealthy?
A: Inheritance
pproger вне форума Ответить с цитированием
Старый 20.08.2009, 16:44   #8
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Объявляйте их со спецификатором extern.

pacman.cpp
Код:
#include "pacman.h"
...
    extern const int s = 20;
pacman.h
Код:
    extern const int s;
main.cpp
Код:
#include "pacman.h"
...
int main()
{
...
операции с s;
...
}

Последний раз редактировалось netrino; 20.08.2009 в 16:47.
netrino вне форума Ответить с цитированием
Старый 20.08.2009, 16:51   #9
jojahti
Подтвердите свой е-майл
 
Регистрация: 27.07.2009
Сообщений: 437
По умолчанию

jojahti
Цитата:
небось используешь не инициализированный указатель
Неа. [дразница]

netrino
Цитата:
Объявляйте их как extern.
Ух ё-моё. C константами тоже можно?

Тогда я не вполне понял что такое определение и объявление.

Ведь если с префиксом экстерн обычной переменной присвоить что-то. Опять будет мультипле дефинитион.
jojahti вне форума Ответить с цитированием
Старый 20.08.2009, 16:54   #10
netrino
Участник клуба
 
Аватар для netrino
 
Регистрация: 15.07.2008
Сообщений: 1,933
По умолчанию

Ну, обычные переменные по умолчанию разрешены к использованию в других модулях, в то время как константы нет. Потому константы надо явно определять как extern
netrino вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Qbasic ошибка "duplicate definition" Костя КС Помощь студентам 5 26.05.2009 22:23