Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск  
 
 
Рейтинг 4.64/11: Рейтинг темы: голосов - 11, средняя оценка - 4.64
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2

Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?

17.11.2014, 08:52. Показов 2489. Ответов 28
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?

У меня есть например несколько файлов:
opengl.h
C++
#ifndef OPENGL_H
#define OPENGL_H
 
extern int a;
extern void foo();
 
#endif // OPENGL_H
main.cpp
C++
#include "opengl.h"
int a;
 
int main()
{
  a = 5;
  return 0;
}
opengl.cpp
C++
#include "opengl.h"
int a;
 
void foo()
{
  a = 9;
}
Видно, что int a объявляется не только в opengl.h, но еще и в main.cpp и opengl.cpp. Как сделать, чтобы можно было один раз написать int a?
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
17.11.2014, 08:52
Ответы с готовыми решениями:

как избавиться от переменных в разделе данных
Написал на ассемблере подпрограмму которая делает шейкерную сортировку. Для границ массива и i-того элемента создал переменные, которые...

Как избавиться в браузерной строке от get переменных
Привет всем. Как мне избавиться от GET переменных в браузерной строке. Вот пример адреса http://stail.ru/order/task?order_id=25, как его...

Есть три файла. файл main.cpp и Source.cpp знают только Header.h, так как он подключен. как же подключается Source.cpp
main.cpp #include <iostream> #include"Header.h" using namespace std; int main() { A ob; ob.f(); return...

28
17.11.2014, 11:13
Студворк — интернет-сервис помощи студентам

Не по теме:

Kuzia domovenok, к даме можно и на "Вы":) хотя, я озадачен. просто озадачен.

0
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 11:36  [ТС]
и ты, всё это время программируя, ни разу не
получал ошибку множественного определения
переменных?
Ну раньше все функции, классы, переменные я писала в заголовках, но говорят так делать не очень хорошо, поэтому сейчас хочу переделать.

Добавлено через 8 минут
Ну раньше все функции, классы, переменные я
писала в заголовках, но говорят так делать не очень
хорошо
С другой стороны, если так все работает и компилируется, оставить все как есть...
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2014, 11:48
Пример в шапке темы абсолютно рабочий после выкидывания объявления "int a" в main.cpp. TheCalligrapher всё верно расписал.

Возможно, проблема с неполным пониманием сути работы препроцессорной директивы include.
Мысленно подставьте её содержимое во все места, где подключаете заголовочный файл и вот, что получится:

opengl.cpp
C++
1
2
3
4
5
6
7
8
9
extern int a; // переменная помечена как external linkage
extern void foo(); // функция помечена как external linkage
 
int a;
 
void foo()
{
  a = 9;
}
main.cpp
C++
1
2
3
4
5
6
7
8
extern int a; // переменная помечена как external linkage
extern void foo(); // функция помечена как external linkage
 
int main()
{
  a = 5;
  return 0;
}
extern говорит о том, что определение может находиться где-то вне текущего модуля(файла).
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 18:24  [ТС]
Сейчас на простом примере работает, причем что удивительно - не имеет значения, где находится int a...

opengl.h
C++
#ifndef OPENGL_H
#define OPENGL_H
 
extern int a;
extern void foo(int va);
extern void yet(int va);
 
#endif // OPENGL_H
main.cpp
C++
#include <stdio.h>
#include "opengl.h"
 
int main()
{
    a = 5;  printf("%d\n", a);
    foo(9); printf("%d\n", a);
    yet(7); printf("%d\n", a);
    return 0;
}
 
int a = 3; // вот, int a; здесь!!!
opengl.cpp
C++
#include "opengl.h"
 
void foo(int va)
{
    a = va;
}
yetanother.cpp
C++
#include "opengl.h"
 
void yet(int va)
{
    a = va;
}
Теперь можно попробовать в большом проекте сделать так же.
0
3258 / 2060 / 351
Регистрация: 24.11.2012
Сообщений: 4,909
17.11.2014, 18:40
Цитата Сообщение от programina Посмотреть сообщение
удивительно - не имеет значения, где находится int a
Главное, что объявление доступно перед использованием.
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 19:13  [ТС]
Переделываю свой проект под раздельную компиляцию и мне попалась структура, которую нельзя написать вместе со словом extern. Отсюда вопрос:

global.h
C++
// extern struct vertex не прокатит
struct vertex {
    float px, py, pz, nx, ny, nz, tu, tv;
    vertex() {}
    vertex(float _px, float _py, float _pz, float _nx, float _ny, float _nz, float _tu, float _tv)
        : px(_px), py(_py), pz(_pz), nx(_nx), ny(_ny), nz(_nz), tu(_tu), tv(_tv) {}
};
global.cpp
C++
// работает и без этого, если я оставлю здесь это
// для удобства, не приведет ли это к каким-нибудь багам?
struct vertex;
0
 Аватар для Kuzia domovenok
4268 / 3327 / 926
Регистрация: 25.03.2012
Сообщений: 12,542
Записей в блоге: 1
17.11.2014, 19:17
programina, а где тут вообще глобальная переменная? Ты уже объявления структур с объявлением переменных путаешь?
1
 Аватар для programina
2062 / 619 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 19:26  [ТС]
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
programina, а где тут вообще глобальная переменная? Ты уже объявления структур с объявлением переменных путаешь?
Структура - это и есть моя переменная.

Добавлено через 2 минуты
А, дошло кажется. vertex - это имя типа...

Добавлено через 4 минуты
Наверно будет лучше, если все структуры, typedef'ы и define'ы убрать куда-нибудь в отдельный файл, чтобы не создавали путаницу.
0
Форумчанин
Эксперт CЭксперт С++
 Аватар для MrGluck
8217 / 5048 / 1437
Регистрация: 29.11.2010
Сообщений: 13,453
17.11.2014, 19:36
Цитата Сообщение от programina Посмотреть сообщение
Наверно будет лучше, если все структуры, typedef'ы и define'ы убрать куда-нибудь в отдельный файл, чтобы не создавали путаницу.
Лучше группировать их по логике. Например, XmlTools.h, StringTools.h, Config.h, GraphicTools.h
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
17.11.2014, 19:36

Как избавиться от глобальных переменных в многофайловом проекте на С++?
Некоторые глобальные переменные можно заменить на глобальные константы. Долго промучилась с проектом, но на попытках избавления от...

Подключение файлов main.cpp some.cpp some.h
Всем привет, программа разделенна на три файла poly.cpp main.cpp poly.h Кто мог бы объяснить как происходит подключение этих файлов, и как...

Графический интерфейс НЕ GUI! как избавиться от глобальных переменных?
Создаю простенький графический интерфейс function = interface( input_args ) global hAxes hFigl hEdl_vertice_X hEdl_vertice_Y...

Как избавиться от системных процедур и функций?
Здравствуйте. У меня есть приложение, которое получает список всех пользовательских процедур и функций в конкретной БД. Делаю я это вот...

Как перенести программу с С++ на С и избавиться от стандартных функций?
Есть программа, заменяющая вводимые цифры соотв. словами. Подскажите, пожалуйста, как перевести её на С? И заодно, возможно ли...


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

Или воспользуйтесь поиском по форуму:
29
Ответ Создать тему
Новые блоги и статьи
Запрет пометки на удаление и отмены проведения
Maks 16.07.2026
Алгоритм из решения ниже реализован на нетиповом документе "ПутевойЛист" разработанного в КА2. Задача: запретить помечать на удаление и отменять проведения путевого листа при условии, если он сдан. . .
Как надо было делать правильно - вообще не слушать ИИ, его дело - текст.
Hrethgir 15.07.2026
А вообще надо было делать не так, чтобы не исправлять ошибку https:/ / www. cyberforum. ru/ blogs/ 223907/ 10996. html , правильно было : удалил кнопку, а потом добавил её. Всё это стресс конечно. Почему?. . .
Знаете, от чего появляется стресс?
kumehtar 15.07.2026
Стресс появляется оттого, что вы, зная как поступить правильно, делаете наоборот. Ларри Уингет
Нас бьют, а мы крепчаем? Какая чушь!
kumehtar 15.07.2026
Вот это вот бытующее мнение, что человек меняется только под действием проблем, всегда считал вредоносным. Поверь, от проблем у людей появляются не изменения, а нервное расстройство и ПТСР. А. . .
сукцессия 29. Переход от одних деревьев на другие делать более или менее вероятностным?
anaschu 12.07.2026
Насколько смена типов микоризы — исключительное событие в двухвековой сукцессии? Оценка вероятности в пространстве параметров В текущей версии модели успешно реализован ключевой механизм. . .
сукцессия 27. Думаю, как переделывать уже написанную статью с планами на сукцессию.
anaschu 12.07.2026
Анализ соответствия модели требованиям Реализованные компоненты: Механизм закисления почвы через протонную помпу Конкуренция между типами микориз pH как триггер сукцессии C/ P соотношение. . .
Сукцессия 26. Мат модель создана.
anaschu 12.07.2026
Модель смены растительных сукцессий посредством управления грибами работает внутри небольшой ячейки почвы, восстанавливающейся после пожара, где ненадолго бывшее царство хвойных снова захватили. . .
Решил проблему с ошибкой пагинации сообщений с сервера на алгоритме обхода дерева "Эстафета хвоста".
Hrethgir 12.07.2026
Проблема была в том, что удалялась именно новая кнопка, а не старая. Ни один ИИ не обнаружил это, а сам я смог только когда с работой стало попроще и когда заставил работать будущее автономное. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru