С Новым годом! Форум программистов, компьютерный форум, киберфорум
Наши страницы

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

Войти
Регистрация
Восстановить пароль
 
 
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
#1

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

17.11.2014, 08:52. Просмотров 698. Ответов 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++):

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

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

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

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

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

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

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

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

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

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

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

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

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

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

Добавлено через 1 минуту
Вечером точно скажу.
0
ValeryS
Модератор
6729 / 5138 / 485
Регистрация: 14.02.2011
Сообщений: 17,254
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
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 10:06  [ТС] #15
для глобальных переменных, я обычно создаю
файл Global.c
Попробую сделать так, если не получится так как пишет TheKaligrapher
0
17.11.2014, 10:06
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 10:06
Привет! Вот еще темы с ответами:

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

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

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

Как подключить библиотеку из двух файлов (.cpp и .h) к проекту - C#
Подскажите, пожалуйста, как подключить библиотеку из двух файлов к проекту? dll-файл подключается просто: ПРОЕКТ - Добавить ссылку. А вот...


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

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

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