Форум программистов, компьютерный форум CyberForum.ru

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

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

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

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

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

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

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

Объясните, пожалуйста, как работает передача переменных при вызове функций? - C++
#include <iostream> #include <conio.h> using namespace std; void z(int *a,int lenght){ int *p; for...

Связка двух функций в разных .cpp файлах - C++
Извиняюсь если тема поднималась, может я плохо искал но не нашел вразумительного объяснения связывания двух функций через заголовочный...

Обращение файлов cpp - C++
Всем привет! Изображу наглядно код: main.cpp #include <iostream> using namespace std; void raznica(); void summa();

Создание cpp файлов - C++
я недавно начал зучать язык программированя С++ и делаю это самостоятельно с помашю книг и интернета. я ищю статьи где было бы подробно...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mss307
17.11.2014, 11:13     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?
  #21

Не по теме:

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 11:36  [ТС]     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #22
и ты, всё это время программируя, ни разу не
получал ошибку множественного определения
переменных?
Ну раньше все функции, классы, переменные я писала в заголовках, но говорят так делать не очень хорошо, поэтому сейчас хочу переделать.

Добавлено через 8 минут
Ну раньше все функции, классы, переменные я
писала в заголовках, но говорят так делать не очень
хорошо
С другой стороны, если так все работает и компилируется, оставить все как есть...
MrGluck
Модератор
Эксперт CЭксперт С++
6997 / 4168 / 594
Регистрация: 29.11.2010
Сообщений: 11,047
17.11.2014, 11:48     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #23
Пример в шапке темы абсолютно рабочий после выкидывания объявления "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 говорит о том, что определение может находиться где-то вне текущего модуля(файла).
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 18:24  [ТС]     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #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;
}
Теперь можно попробовать в большом проекте сделать так же.
0x10
2459 / 1631 / 238
Регистрация: 24.11.2012
Сообщений: 4,009
17.11.2014, 18:40     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #25
Цитата Сообщение от programina Посмотреть сообщение
удивительно - не имеет значения, где находится int a
Главное, что объявление доступно перед использованием.
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 19:13  [ТС]     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #26
Переделываю свой проект под раздельную компиляцию и мне попалась структура, которую нельзя написать вместе со словом 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;
Kuzia domovenok
1889 / 1744 / 117
Регистрация: 25.03.2012
Сообщений: 5,922
Записей в блоге: 1
17.11.2014, 19:17     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #27
programina, а где тут вообще глобальная переменная? Ты уже объявления структур с объявлением переменных путаешь?
programina
1914 / 599 / 37
Регистрация: 23.10.2011
Сообщений: 4,468
Записей в блоге: 2
17.11.2014, 19:26  [ТС]     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #28
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
programina, а где тут вообще глобальная переменная? Ты уже объявления структур с объявлением переменных путаешь?
Структура - это и есть моя переменная.

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

Добавлено через 4 минуты
Наверно будет лучше, если все структуры, typedef'ы и define'ы убрать куда-нибудь в отдельный файл, чтобы не создавали путаницу.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
17.11.2014, 19:36     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?
Еще ссылки по теме:

Архитектура размещения h и cpp файлов - C++
Доброго времени суток! Есть библа, содержащая ряд функций. Допустим, func1, func2 и ещё over 10. Меня интересует, как стандарты, здравая...

Несколько cpp файлов в проекте - C++
Доброго времени суток ! Есть проект и в нем 2 cpp файла: Main.cpp и BinaryNumber.cpp В последнем файле создан класс и его методы....

Условное подключение cpp файлов - C++
Здравствуйте,я вот захотел сделать в своей программе выбор языка,но увеличивать программу на кучу строк не захотел и поэтому создал 2 файла...

Добавление cpp файлов в процессе компиляции - C++
Есть у меня проект. Тут один файл main #include &quot;D:\\test.h&quot; void main() { test obj; obj.func(); }

Подключение в проекте .hpp и .cpp файлов - C++
Добрый день! Среда разработки Code Blocks 13.12 Компилятор GNU GCC В проекте существует 3 файла в проекте - main.cpp, SW229.cpp и...


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

Или воспользуйтесь поиском по форуму:
MrGluck
Модератор
Эксперт CЭксперт С++
6997 / 4168 / 594
Регистрация: 29.11.2010
Сообщений: 11,047
17.11.2014, 19:36     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #29
Цитата Сообщение от programina Посмотреть сообщение
Наверно будет лучше, если все структуры, typedef'ы и define'ы убрать куда-нибудь в отдельный файл, чтобы не создавали путаницу.
Лучше группировать их по логике. Например, XmlTools.h, StringTools.h, Config.h, GraphicTools.h
Yandex
Объявления
17.11.2014, 19:36     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?
Ответ Создать тему
Опции темы

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