Форум программистов
 
О проблемах, например, с регистрацией пишите сюда - alarforum@yandex.ru, проверяйте папку спам! Обязательно пройдите активизацию e-mail, а тут можно восстановить пароль.

Вернуться   Форум программистов > C++ > Visual C++
Регистрация

Восстановить пароль
Повторная активизация e-mail

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Ответ
 
Опции темы
Старый 08.12.2012, 17:37   #1
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию Многофайловые проекты

Недавно взглянул на код своих программ, которые имеют большой код, их очень неудобно редактировать. В итоге взялся разбивать по файлам. Скопировав название темы в любую поисковую систему, можно найти много полезной информации по этой теме. Но я что-то упустил, а что конкретно - не пойму. Сделал три файла(для тренировки) Один .h и два .cpp. Приведу сокращенные варианты кода.
AllFunctions.h
Код:
#ifndef ALL_FUNCTION
#define ALL_FUNCTION

#include <gl/freeglut.h>
#include <stdio.h>
#include <cmath>
#include "AllFunction.h"

class vectors
{
	struct sSee
	{
		float x,y,z;
	};
	struct sPosition
	{
		float x,y,z;
	};
public:
	sSee see;
	sPosition position;

};

extern bool keys[256];

extern const float PI=3.141592653589793; 
extern float teta=0.0f,fi=3.14f;
extern int   width,height,OldX,OldY;
extern float OGLwidth;
extern float angle,v=2.0;
extern vectors host;

void KeyDown(unsigned char key,int x,int y);
void KeyUp(unsigned char key,int x,int y);
void Keys();
void motion(int x,int y);
double RadToDeg(double Radian);
void Reshape(int width, int height);
void Timer(int value);
void Draw(void);
int APIENTRY WinMain(HINSTANCE hInstance,
	                 HINSTANCE hPrevInstance,
					 LPTSTR    lpCmdLine,
					 int       nCmdShow);
#endif
Main.cpp
Код:
#include "AllFunction.h"

const float PI=3.141592653589793; 
float teta=0.0f,fi=3.14f;
int   width,height,OldX,OldY;
float OGLwidth;
float angle,v=2.0;
vectors host;

double RadToDeg(double Radian)
{
        ......
}

void Reshape(int width, int height)
{
        .......
}

void Timer(int value)
{
	....
}

void Draw(void)
{
        ...
}
int APIENTRY WinMain(HINSTANCE hInstance,
	                 HINSTANCE hPrevInstance,
					 LPTSTR    lpCmdLine,
					 int       nCmdShow)
{
        ...
}
Controls.cpp
Код:
#include "AllFunction.h"


void KeyDown(unsigned char key,int x,int y)
{
   ...
}

void KeyUp(unsigned char key,int x,int y)
{
   ...
}

void motion(int x,int y)
{
   ...
}

void Keys()
{
   ...
}
После начинаются ошибки
Цитата:
1>d:\cpp project\MultiFileProject\MultiFileP roject\main.cpp(3): error C2370: PI: переопределение; другой класс хранения
1> d:\cpp project\MultiFileProject\MultiFileP roject\allfunction.h(27): см. объявление "PI"
1>d:\cpp project\MultiFileProject\MultiFileP roject\main.cpp(3): warning C4305: инициализация: усечение из "double" к "const float"
1>d:\cpp project\MultiFileProject\MultiFileP roject\main.cpp(4): error C2374: teta: переопределение; множественная инициализация
1> d:\cpp project\MultiFileProject\MultiFileP roject\allfunction.h(28): см. объявление "teta"
1>d:\cpp project\MultiFileProject\MultiFileP roject\main.cpp(4): error C2374: fi: переопределение; множественная инициализация
1> d:\cpp project\MultiFileProject\MultiFileP roject\allfunction.h(28): см. объявление "fi"
1>d:\cpp project\MultiFileProject\MultiFileP roject\main.cpp(7): error C2374: v: переопределение; множественная инициализация
1> d:\cpp project\MultiFileProject\MultiFileP roject\allfunction.h(31): см. объявление "v"
Работаю в Visual Studio но pragma once использовать не хочу, хотя директива проблему и не решает. Складывается ощущение, что я чего-то недопонимаю.
Заранее спасибо.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 08.12.2012, 18:03   #2
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Вы в AllFunctions.h выключаете AllFunctions.h?
p51x вне форума Ответить с цитированием
Старый 08.12.2012, 18:37   #3
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Это я в одном примере увидел и решил попробовать. Убрав эту строку, ничего не меняется. Если нужно, то во вложения проект полностью.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог

Последний раз редактировалось _PROGRAMM_; 08.12.2012 в 18:49.
_PROGRAMM_ вне форума Ответить с цитированием
Старый 08.12.2012, 18:46   #4
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Уберите в хедере инициализацию.
p51x вне форума Ответить с цитированием
Старый 08.12.2012, 18:51   #5
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Какую инициализацию?(прямой вопрос) Хедер приведен полностью.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 08.12.2012, 19:01   #6
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Код:
extern const float PI=3.141592653589793; 
extern float teta=0.0f,fi=3.14f;
extern int   width,height,OldX,OldY;
extern float OGLwidth;
extern float angle,v=2.0;
p51x вне форума Ответить с цитированием
Старый 08.12.2012, 19:04   #7
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

А в файле Controls.cpp используются эти же переменные, если убрать инициализацию он о них знать не будет.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Старый 08.12.2012, 19:40   #8
waleri
Старожил
 
Регистрация: 13.07.2012
Сообщений: 6,197
По умолчанию

Сделайте в заголовоке только
extern <type> <var>;
и выучите терминологию.
waleri вне форума Ответить с цитированием
Старый 08.12.2012, 19:56   #9
p51x
Старожил
 
Регистрация: 15.02.2010
Сообщений: 15,103
По умолчанию

Цитата:
если убрать инициализацию он о них знать не будет
Шутите или не допонимаете? Он будете знать адреса, где они в памяти, и оттуда будет читать их значения, а не из вашего хедера.
p51x вне форума Ответить с цитированием
Старый 09.12.2012, 12:57   #10
_PROGRAMM_
Участник клуба
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Сообщений: 1,603
По умолчанию

Скорее недопонимаю, сейчас уже не так темно, как было. Спасибо за ответы.

В мире нет вечных двигателей, зато есть вечные тормоза...

Блог
_PROGRAMM_ вне форума Ответить с цитированием
Ответ

Здесь нужно купить рекламу за 20 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru
Без учёта ботов - 20000 человек в день, 350000 в месяц.

Опции темы


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Многофайловые проекты. inc Общие вопросы C/C++ 1 25.04.2012 15:57
Многомодульные проекты в VS C++ Копоть Артём Visual C++ 5 23.08.2011 11:29
Модули. Многофайловые проекты . Zalik Помощь студентам 3 01.03.2011 06:04
разработать проекты.... Virus Помощь студентам 2 20.06.2007 16:53


Проекты отопления, пеллетные котлы, бойлеры, радиаторы
интернет магазин respective.ru
Пеллетный котёл Emtas
котлы EMTAS