Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
 
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

17.11.2014, 08:52. Просмотров 745. Ответов 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
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
17.11.2014, 08:52
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? (C++):

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

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

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

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

Как в windows сделать динамическую библиотеку из файлов .cpp через командную строку ?
Здраствуйте, вопрос состоит в следующем, как у Виндовс через командную ...

C++ (ооп) как из трех файлов (2 cpp и h) сделать одну программу? code blocks
C++ (ооп) как из трех файлов (2 cpp и h) сделать одну программу? code blocks

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

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

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

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

Хоть у вас 500 файлов, хоть миллион, во всей программе у вас будет открытым текстом написано ровно два 'int a;': один в заголовке как 'extern int a;' и еще один в одном из файлов реализации, как 'int a;'.
1
programina
2049 / 604 / 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
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4377 / 2352 / 655
Регистрация: 18.10.2014
Сообщений: 4,002
17.11.2014, 09:39 #8
Цитата Сообщение от programina Посмотреть сообщение
А если не один int a, а еще int b, int c, int d и т.д. штук 200,
Вы, я вижу, не читатель, а писатель.

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

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

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

Добавлено через 1 минуту
Вечером точно скажу.
0
ValeryS
Модератор
7134 / 5402 / 669
Регистрация: 14.02.2011
Сообщений: 18,226
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
programina
2049 / 604 / 41
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 10:06  [ТС] #15
для глобальных переменных, я обычно создаю
файл Global.c
Попробую сделать так, если не получится так как пишет TheKaligrapher
0
TheCalligrapher
С чаем беда...
Эксперт CЭксперт С++
4377 / 2352 / 655
Регистрация: 18.10.2014
Сообщений: 4,002
17.11.2014, 10:24 #16
Цитата Сообщение от programina Посмотреть сообщение
Попробую сделать так, если не получится так как пишет TheKaligrapher
Гм... И я, и ValeryS написали абсолютно одно и то же.
1
mss307
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
Kuzia domovenok
2213 / 1982 / 444
Регистрация: 25.03.2012
Сообщений: 6,965
Записей в блоге: 1
17.11.2014, 11:09 #20
Регистрация: 23.10.2011
Сообщений: 4,439
... и ты, всё это время программируя, ни разу не получал ошибку множественного определения переменных?
0
17.11.2014, 11:09
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 11:09
Привет! Вот еще темы с решениями:

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

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

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

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


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

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

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