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

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

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

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

17.11.2014, 08:52. Просмотров 612. Ответов 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 файлов
Как писать проэкты из нескольких CPP файлов ? C++
C++ (ооп) как из трех файлов (2 cpp и h) сделать одну программу? code blocks C++
Объясните, пожалуйста, как работает передача переменных при вызове функций? C++
Архитектура размещения h и cpp файлов C++
C++ Обращение файлов cpp
C++ Добавление cpp файлов в процессе компиляции
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
mss307
17.11.2014, 11:13     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных?
  #21

Не по теме:

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

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

Добавлено через 8 минут
Ну раньше все функции, классы, переменные я
писала в заголовках, но говорят так делать не очень
хорошо
С другой стороны, если так все работает и компилируется, оставить все как есть...
MrGluck
Ворчун
Эксперт CЭксперт С++
6426 / 3624 / 450
Регистрация: 29.11.2010
Сообщений: 9,582
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
1913 / 598 / 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
2452 / 1624 / 238
Регистрация: 24.11.2012
Сообщений: 3,999
17.11.2014, 18:40     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #25
Цитата Сообщение от programina Посмотреть сообщение
удивительно - не имеет значения, где находится int a
Главное, что объявление доступно перед использованием.
programina
1913 / 598 / 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
1887 / 1742 / 117
Регистрация: 25.03.2012
Сообщений: 5,916
Записей в блоге: 1
17.11.2014, 19:17     Как избавиться от замусоривания cpp файлов дубликатами деклараций функций и переменных? #27
programina, а где тут вообще глобальная переменная? Ты уже объявления структур с объявлением переменных путаешь?
programina
1913 / 598 / 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 файлов дубликатами деклараций функций и переменных?
Еще ссылки по теме:

C++ Несколько cpp файлов в проекте
Условное подключение cpp файлов C++
Связка двух функций в разных .cpp файлах C++
C++ Компиляция .cpp-файлов из программы
Подключение в проекте .hpp и .cpp файлов C++

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

Или воспользуйтесь поиском по форуму:
MrGluck
Ворчун
Эксперт CЭксперт С++
6426 / 3624 / 450
Регистрация: 29.11.2010
Сообщений: 9,582
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 файлов дубликатами деклараций функций и переменных?
Ответ Создать тему
Опции темы

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