Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
#1

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

05.04.2014, 21:53. Просмотров 850. Ответов 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
Решает эту проблему. ЧЯДНТ? Спасибо, кто откликнется.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.04.2014, 21:53
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Глобальная переменная определена в хидере. Компилятор ругается на то, что переменная переопределена несколько раз (C++):

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

Глобальная переменная - C++
Никогда с таким не сталкивался... В общем: Надо обьявить глобальный масив в одной функции, но чтобы его видели все другие функции. Вне...

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

Глобальная переменная - C++
#include "stdafx.h" #include "locale" #include "iostream" #include "conio.h" using namespace::std; int count = -1; void swap();...

Глобальная переменная в OpenCL - C++
Всем привет! Кто может подсказать как правильно создать глобальную переменную в OpenCL? unsigned char *globalVariable; __kernel...

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

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

Посмотри в сторону ключевого слова extern
2
kravam
быдлокодер
1697 / 884 / 45
Регистрация: 04.06.2008
Сообщений: 5,484
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
Привет! Вот еще темы с ответами:

Глобальная переменная не читается в новом потоке - C++
подскажите пожалуйста, у меня есть помимо главного еще 2 потока и есть глобально объявленный массив, заполняю я его в первом потоке, там же...

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

Динамический массив как глобальная переменная - C++
Доброго времени суток, даже с google никак не смогу разобраться со следующей задачей: Хочу объявить матрицу(matrix допустим) глобальной...

Переменная уже определена в Form_5.obj - C++
Здравствуйте, я наткнулся на следующую проблему и не могу решить. Вот имеется код файла Form_5.h: #ifndef _FORM5_H #define _FORM5_H ...


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

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

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