Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
#1

Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз - C++

05.04.2014, 21:53. Просмотров 1017. Ответов 4
Метки нет (Все метки)

Исходники:

C++
1
2
3
4
5
6
/* main.cpp */
#include "hider.h"
int main(void)
{
 return 0;
}
C++
1
2
3
/* foo.cpp */
#include "hider.h"
void bar(void){}
C++
1
2
3
4
5
6
7
//hider.h
#ifndef _HIDER_H
#define _HIDER_H
 
int k;
 
#endif
Команда и результат, компилятор g++
Bash
1
2
3
4
g++ -o main.exe main.cpp foo.cpp
foo.o:foo.cpp:(.bss+0x0): multiple definition of `k'
main.o:main.cpp:(.bss+0x0): first defined here
collect2: ld returned 1 exit status
(При раздельной компиляции то же самое.)

Странно, мне всю жизнь казалось, что
C++
1
2
3
4
#ifndef _HIDER_H
#define _HIDER_H
//код
#endif
Решает эту проблему. ЧЯДНТ? Спасибо, кто откликнется.
http://www.cyberforum.ru/cpp-beginners/thread117800.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 21:53
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз (C++):

Глобальная переменная
Есть двумерный символьный массив ClusterBuf объявленный глобально. В него,в...

Глобальная переменная
#include "stdafx.h" #include "locale" #include "iostream" #include "conio.h"...

Глобальная переменная
Надо сделать глобальную переменную которая будет видна во всех файлах .cpp ...

Глобальная переменная из другой dll
Имеется сторонняя dll без исходников. Мне нужно в своей программе получить...

Глобальная переменная локальной видимости
Я где-то читал, что если объявить переменную вне функций, а затем определить ее...

4
alsav22
5438 / 4833 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
05.04.2014, 22:07 #2
Лучший ответ Сообщение было отмечено kravam как решение

Решение

Цитата Сообщение от kravam Посмотреть сообщение
мне всю жизнь казалось, что...Решает эту проблему.
Для одного файла.
В хедере:
C++
1
extern int k; // просто объявление (без определения)
В каком-либо .cpp сделать определение (выделить память).
1
rrrFer
Заблокирован
05.04.2014, 22:07 #3
Лучший ответ Сообщение было отмечено kravam как решение

Решение

Ну а как ты хотел?
.cpp файл - это единица компиляции. Ты говоришь ему включить заголовочный файл, он слепо и не глядя ни на что его включает. В каждой единице компиляции своя глобальная переменная. Для каждой единице компиляции создается свой объектный файл. Все объектные файлы передаются линкеру и вот тут он замечает, что он не может слепить объектные файлы в кучу потому, что имена глобальных переменных в них пересекаются (он же не знает что ты от всего этого хочешь...).

Посмотри в сторону ключевого слова extern
2
kravam
быдлокодер
1706 / 893 / 105
Регистрация: 04.06.2008
Сообщений: 5,524
06.04.2014, 02:02  [ТС] #4
Остался маленький вопрос. Вот это для чего?
C++
1
2
3
4
#ifndef _HIDER_H
#define _HIDER_H
//код
#endif
Обычно я (надеюсь, не только), работая с одним файлом, пишу так:

C++
1
2
3
4
5
6
/* main.cpp */
#include "hider.h"
int main(void)
{
 return 0;
}
Всё. И он скомпилится и без первой конструкции. Зачем же она?

Добавлено через 9 минут
А понял. Это для таких случаев:

C++
1
2
3
4
5
6
7
/* main.cpp */
#include "hider.h"
#include "hider_main.h"
int main(void)
{
 return 0;
}

C++
1
2
3
4
5
//hider.h
#ifndef _HIDER_H
#define _HIDER_H
int k;
#endif
C++
1
2
3
4
5
//hider_main.h
#ifndef _HIDER_MAIN_H
#define _HIDER_MAIN_H
#include "hider.h"
#endif
Bash
1
g++ -o main.exe main.cpp
0
rrrFer
Заблокирован
06.04.2014, 04:45 #5
Цитата Сообщение от kravam Посмотреть сообщение
Остался маленький вопрос. Вот это для чего?
Для того, чтобы твоя глобальная переменная не оказалась включена в один объектный файл несколько раз.

в 1.h описана глобальная переменная
2.h включает 1.h
3.h включает 1.h и 2.h

Если в 1.h нет "этого" - то глобальная переменная будет описана дважды, о чем ты получишь сообщение.

В противном случае (если "это" описано), то 3.h при обработке очередного include обнаруживает, что _HIDER_H уже определен и пропускает то, что внутри #ifndef _HIDER_H.
0
06.04.2014, 04:45
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.04.2014, 04:45
Привет! Вот еще темы с решениями:

Не определяется глобальная переменная внутри функции
Доброго времени суток! Передо мной стоит задача: Задано множество точек М в...

Динамический массив как глобальная переменная
Доброго времени суток, даже с google никак не смогу разобраться со следующей...

Глобальная переменная не читается в новом потоке
подскажите пожалуйста, у меня есть помимо главного еще 2 потока и есть...

Переменная уже определена в Form_5.obj
Здравствуйте, я наткнулся на следующую проблему и не могу решить. Вот имеется...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru