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

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

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


Донат для форума - использовать для поднятия настроения себе и модераторам

А ещё здесь можно купить рекламу за 25 тыс руб в месяц! ) пишите сюда - alarforum@yandex.ru

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

Недавно взглянул на код своих программ, которые имеют большой код, их очень неудобно редактировать. В итоге взялся разбивать по файлам. Скопировав название темы в любую поисковую систему, можно найти много полезной информации по этой теме. Но я что-то упустил, а что конкретно - не пойму. Сделал три файла(для тренировки) Один .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, 19:03   #2
p51x
Профессионал
 
Регистрация: 15.02.2010
Сообщений: 14,905
Репутация: 2668
По умолчанию

Вы в AllFunctions.h выключаете AllFunctions.h?
__________________
Запомните раз и навсегда: помочь != "решите за меня"!
p51x на форуме   Ответить с цитированием
Старый 08.12.2012, 19:37   #3
_PROGRAMM_
Профессионал
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Адрес: Российская Федерация
Сообщений: 1,603
Репутация: 239
По умолчанию

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

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

Блог

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

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

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

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

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

Код:
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, 20:04   #7
_PROGRAMM_
Профессионал
 
Аватар для _PROGRAMM_
 
Регистрация: 30.07.2009
Адрес: Российская Федерация
Сообщений: 1,603
Репутация: 239
По умолчанию

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

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

Блог
_PROGRAMM_ вне форума   Ответить с цитированием
Старый 08.12.2012, 20:40   #8
waleri
Профессионал
 
Регистрация: 13.07.2012
Адрес: Нижний Новгород
Сообщений: 5,928
Репутация: 1937
По умолчанию

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

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

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

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

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

Опции темы

Ваши права в разделе
Вы не можете создавать новые темы
Вы не можете отвечать в темах
Вы не можете прикреплять вложения
Вы не можете редактировать свои сообщения

BB коды Вкл.
Смайлы Вкл.
[IMG] код Вкл.
HTML код Выкл.

Быстрый переход

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


17:25.


Powered by vBulletin® Version 3.8.11
Copyright ©2000 - 2019, Jelsoft Enterprises Ltd.