Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.56/9: Рейтинг темы: голосов - 9, средняя оценка - 4.56
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
1

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

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

Author24 — интернет-сервис помощи студентам
Как избавиться от замусоривания 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
17.11.2014, 08:52
Ответы с готовыми решениями:

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

Как избавиться в браузерной строке от get переменных
Привет всем. Как мне избавиться от GET переменных в браузерной строке. Вот пример адреса...

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

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

28
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 09:08 2
Цитата Сообщение от programina Посмотреть сообщение
Как сделать, чтобы можно было один раз написать int a?
Ну вообще-то должно быть два раза: объявление и определение. Для того, чтобы получить глобальную переменную (если она вам действительно нужна), в заголовочном файле должно быть написано 'extern int a;' (объявление), а в одном-единственном файле реализации - просто 'int a;' (определение). В какой именно файл вы поместите это определение - ваш выбор. Все.

А то, что у вас определение 'int a;' повторяется в нескольких файлах реализации - это грубая ошибка. В языке С++ такое запрещается. Поэтому ответ на ваш вопрос прост - просто выкосите нафиг лишние определения из файлов реализации и оставьте лишь одно объявление в заголовочном файле и одно определение в каком-то файле реализации.

Ситуация полностью аналогична ситуации с 'foo'. Вы же не пихаете определение функции 'foo' в несколько файлов реализации? Вот и определение переменной тоже пихать не надо.
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 09:27  [ТС] 3
Так ведь если я уберу int a например в main.cpp, то будет ошибка, значит нужно в каждый файл cpp писать int a.
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 09:29 4
Цитата Сообщение от programina Посмотреть сообщение
Так ведь если я уберу int a например в main.cpp, то будет ошибка
С чего бы это вдруг? Какая ошибка? Приведите пример.

Если это файлы одной программы, то нет, никакой ошибки не будет.
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 09:30  [ТС] 5
А если этих файлов cpp штук 500, то 500 int a по одному в каждом + 1 extern int a в заголовке.
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 09:36 6
Цитата Сообщение от programina Посмотреть сообщение
А если этих файлов cpp штук 500, то 500 int a по одному в каждом
На колу мочало, начинай сначала... Я же ясно сказал - так делать нельзя ни в коем случае. 'int a;' должно присутствовать только в одном файле реализации. Все.

Хоть у вас 500 файлов, хоть миллион, во всей программе у вас будет открытым текстом написано ровно два 'int a;': один в заголовке как 'extern int a;' и еще один в одном из файлов реализации, как 'int a;'.
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 09:37  [ТС] 7
А если не один int a, а еще int b, int c, int d и т.д. штук 200, то получится 200*500 = 100000 переменных.
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 09:39 8
Цитата Сообщение от programina Посмотреть сообщение
А если не один int a, а еще int b, int c, int d и т.д. штук 200,
Вы, я вижу, не читатель, а писатель.

В любом случае, если у вас в программе 200 глобальных переменных вида 'int a' россыпью, то проблему надо править в несколько другой консерватории...
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 09:40  [ТС] 9
TheCalligrapher, мне кажется так не будет работать, в файле реализации, где нет int a; должно выдать ошибку. Вчера по крайней мере выдавало, сегодня вечером еще раз проверю.
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 09:41 10
Цитата Сообщение от programina Посмотреть сообщение
TheCalligrapher, мне кажется так не будет работать, в файле реализации, где нет int a; должно выдать ошибку.
Вы несете чепуху. С чего бы это вдруг оно будет выдавать ошибку?

Наоборот, если вы начнете пихать 'int a' в каждый файл реализации, то получите от линкера ошибку множественного определения. (Некоторые реализации разрешают подобное, если определение не содержит инициализатора. Но это тем не менее не меняет того факта, что это ошибка.)

Цитата Сообщение от programina Посмотреть сообщение
Вчера по крайней мере выдавало,
Вчера вы что-то делали совсем не так, как описываете сейчас.
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 09:43  [ТС] 11
В любом случае, если у вас в программе 200
глобальных переменных вида 'int a', то проблему
надо править в несколько другой консерватории...
Не надо, мне нужно много глобальных переменных, чтобы они виделись во всех файлах.
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 09:46 12
Цитата Сообщение от programina Посмотреть сообщение
мне нужно много глобальных переменных, чтобы они виделись во всех файлах.
Именно для этого вы помещаете 'extern int a;' в заголовочный файл. Именно это делает переменную 'a' видимой во всех файлах (не забывайте только включать заголовочный файл везде, где надо). Больше ничего делать не надо.
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 09:47  [ТС] 13
Вчера вы что-то делали совсем не так, как
описываете сейчас
Возможно. Пишу по памяти, компилятора по рукой нет

Добавлено через 1 минуту
Вечером точно скажу.
0
Модератор
Эксперт по электронике
8908 / 6677 / 918
Регистрация: 14.02.2011
Сообщений: 23,521
17.11.2014, 09:58 14
Цитата Сообщение от programina Посмотреть сообщение
Видно, что int a объявляется не только в opengl.h, но еще и в main.cpp и opengl.cpp. Как сделать, чтобы можно было один раз написать int a?
для глобальных переменных, я обычно создаю
файл Global.c
C
1
2
3
4
#include "Global.h"
int a;
int b;
.......
и файл Global.h
C
1
2
3
4
5
6
#ifndef GLOBAL_H
#define GLOBAL_H
extern int a;
extern int b;
.......
#endif
потом где нужно подключаю Global.h
1
2062 / 618 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 10:06  [ТС] 15
для глобальных переменных, я обычно создаю
файл Global.c
Попробую сделать так, если не получится так как пишет TheKaligrapher
0
Вездепух
Эксперт CЭксперт С++
11695 / 6374 / 1724
Регистрация: 18.10.2014
Сообщений: 16,066
17.11.2014, 10:24 16
Цитата Сообщение от programina Посмотреть сообщение
Попробую сделать так, если не получится так как пишет TheKaligrapher
Гм... И я, и ValeryS написали абсолютно одно и то же.
1
118 / 118 / 41
Регистрация: 14.12.2013
Сообщений: 352
17.11.2014, 10:34 17
TheCalligrapher,

Не по теме:

нефига, ТС выбрал ValeryS )) хотя с согласен с твоим постом.

0
TheCalligrapher
17.11.2014, 10:38
  #18

Не по теме:

Цитата Сообщение от mss307 Посмотреть сообщение
нефига, ТС выбрал ValeryS ))
Посмотрим, что он запоет, когда его припашут определять "200*500 = 100000 переменных" россыпью в 500 файлах.

0
ValeryS
17.11.2014, 11:01
  #19

Не по теме:

Цитата Сообщение от TheCalligrapher Посмотреть сообщение
когда его припашут
А некому меня припахивать:)
сам создаю ТЗ, сам решаю, сам у себя принимаю, сам себя матерю:)
Заказчику нужно чтобы железяка "моргала", а что там внутри ему не интересно

0
4064 / 3318 / 924
Регистрация: 25.03.2012
Сообщений: 12,493
Записей в блоге: 1
17.11.2014, 11:09 20
Регистрация: 23.10.2011
Сообщений: 4,439
... и ты, всё это время программируя, ни разу не получал ошибку множественного определения переменных?
0
17.11.2014, 11:09
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
17.11.2014, 11:09
Помогаю со студенческими работами здесь

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

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

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

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

Как писать проэкты из нескольких CPP файлов ?
Поставил себе Visual C++ Express 2010, написал консольную программку. У неё внутри получилось много...

Как подключить библиотеку из двух файлов (.cpp и .h) к проекту
Подскажите, пожалуйста, как подключить библиотеку из двух файлов к проекту? dll-файл подключается...


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

Или воспользуйтесь поиском по форуму:
20
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru