Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.72/18: Рейтинг темы: голосов - 18, средняя оценка - 4.72
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698

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

05.04.2014, 21:53. Показов 3869. Ответов 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
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
05.04.2014, 21:53
Ответы с готовыми решениями:

Что такое глобальная переменная?
у меня вот такое: declare a -global- variable of type CAppLog in a general module in your application я перевести могу, но как это...

Переменная не определена, что делать
Здравствуйте!Помогите и мне,пишет переменная не определена Задание: В документе предусмотреть выполнение следующих действий: ...

Ошибки что переменная не определена
здраствуйте я не знал куда обратиться с этим вопросом поэтому обратился сюда у меня к вам небольшой вопрос : я написал программу в...

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

Решение

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

Решение

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

Посмотри в сторону ключевого слова extern
2
быдлокодер
 Аватар для kravam
1724 / 911 / 106
Регистрация: 04.06.2008
Сообщений: 5,698
06.04.2014, 02:02  [ТС]
Остался маленький вопрос. Вот это для чего?
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
Заблокирован
06.04.2014, 04:45
Цитата Сообщение от kravam Посмотреть сообщение
Остался маленький вопрос. Вот это для чего?
Для того, чтобы твоя глобальная переменная не оказалась включена в один объектный файл несколько раз.

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

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

В противном случае (если "это" описано), то 3.h при обработке очередного include обнаруживает, что _HIDER_H уже определен и пропускает то, что внутри #ifndef _HIDER_H.
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
06.04.2014, 04:45
Помогаю со студенческими работами здесь

Не создаётся глобальная переменная, что ли... Почему?
<HTML> <HEAD> <TITLE> Test page </TITLE> </HEAD> <BODY> <p> <P>Authorize <form action="param_2.php"...

Почему пишет, что переменная x не определена?
Почему пишет, что переменная x не определена

Что я не так делаю? Переменная не определена
Здравствуйте, прошу помощи. Делаю все в сооотв. с методическими указаниями преподавателя, но "переменная не определена". Все...

Путь для БД (глобальная переменная или что?)
Всем привет. Столкнулся с такой проблемкой. Экселевский файл работает с БД. В VB коде содержится несколько модулей с разными запросами...

Игра морской бой.Можете объяснить операцию case что она делает ?И что означает переменная m3,m2,m1, и переменная z?
Листинг программы: var Form1: TForm1; i,j,g,x1,y1,k11,k21, k33,k32,k31,m3,m2,m1, //кол-во 3х 2х 1х кораблей m,n,z:integer; rot,...


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

Или воспользуйтесь поиском по форуму:
5
Ответ Создать тему
Новые блоги и статьи
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
Фото: Daniel Greenwood
kumehtar 13.11.2025
Расскажи мне о Мире, бродяга
kumehtar 12.11.2025
— Расскажи мне о Мире, бродяга, Ты же видел моря и метели. Как сменялись короны и стяги, Как эпохи стрелою летели. - Этот мир — это крылья и горы, Снег и пламя, любовь и тревоги, И бескрайние. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru