Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > C/C++ программирование > Общие вопросы C/C++
Регистрация

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

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 13.06.2014, 08:10   #1
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию Инклюд структур и функций в два файла

Есть .h файл со структурами и функциями, которые используются в других файлах. Пробовал инклюд этого файла в других, пишет, что файл уже определен. Вроде как нужно обрамить все эти функции в блок
Код:
#ifndef T
#define T 123
#endif
Это также не помогает. В чем я не прав? Подскажите.
danil123 вне форума Ответить с цитированием
Старый 13.06.2014, 08:16   #2
Пепел Феникса
Старожил
 
Аватар для Пепел Феникса
 
Регистрация: 28.01.2009
Сообщений: 21,000
По умолчанию

в том что в хидере не должно быть не одной реализации переменных или функций.
Хорошо поставленный вопрос это уже половина ответа. | Каков вопрос, таков ответ.
Программа делает то что написал программист, а не то что он хотел.
Функции/утилиты ждут в параметрах то что им надо, а не то что вы хотите.
Пепел Феникса вне форума Ответить с цитированием
Старый 13.06.2014, 10:24   #3
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

Цитата:
Сообщение от Пепел Феникса Посмотреть сообщение
в том что в хидере не должно быть не одной реализации переменных или функций.
т.е. реализацию функций надо писать отдельно в каждом файле? Неважно, что они одинаковые?
danil123 вне форума Ответить с цитированием
Старый 13.06.2014, 11:29   #4
casekey
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 95
По умолчанию

Цитата:
Сообщение от danil123 Посмотреть сообщение
т.е. реализацию функций надо писать отдельно в каждом файле? Неважно, что они одинаковые?
Реализация должна быть в одном файле, который соответствует хедеру.

К примеру пусть есть хедер SomeFunctional.h:
Код:
#ifndef SOMEFUNCTIONAL_H
#define SOMEFUNCTIONAL_H

int someFunc(); // Тут нет реализации функций. Только их объявление...
float someAnotherFunc();

class SomeClass
{
...
};

#endif
К этому хедеру должен идти файл реализации SomeFunctional.cpp:
Код:
#include "SomeFunctional.h"

int someFunc()
{
// Реализация функции
}

float someAnotherFunc()
{
// Реализация функции
}

// Реализация функций класса someClass
Вот и все. Где нужно использовать эти функции мы подключаем только SomeFunctional.h:

Код:
#include <iostream>
#include "SomeFunctional.h"

int main()
{
  int a = someFunc();
  return 0;
}
casekey вне форума Ответить с цитированием
Старый 13.06.2014, 12:38   #5
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

сделал, как вы сказали.
Теперь все вынесенные функции выдают ошибку
danil123 вне форума Ответить с цитированием
Старый 13.06.2014, 12:56   #6
casekey
Пользователь
 
Регистрация: 03.11.2010
Сообщений: 95
По умолчанию

Код покажи. Или будем гадать по ошибке линкера?
casekey вне форума Ответить с цитированием
Старый 13.06.2014, 13:23   #7
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

Полностью приводить не буду, ибо огромная куча функций.
1.cpp:
Код:
#include "structs_declaration.h"
// использование функции
2.cpp:
Код:
#include "structs_declaration.h"
// использование функции
structs_definition.h:
Код:
#include"structs_declaration.h"

Tfirst* createlist()
{
	Tfirst *st1=new Tfirst;
	st1->count=0;
	st1->next=0;
	return st1; 

}
void push(Tfirst* st1,string data)	
{
	st1->count+=1;
	Tstack* newstack=new Tstack;
	newstack->prev=st1->last;
	newstack->data=data;
	newstack->next=0;
	st1->last=newstack;

}

void pop(Tfirst* st1)
{
	Tstack* stack= st1->last;
	st1->count-=1;
	st1->last=stack->prev;

}
structs_declaration.h:
Код:
#ifndef qwe
#define qwe 10

#include<iostream>
using namespace std;
struct Tstack
{
	string data;
	Tstack* next;
	Tstack* prev;
};

struct Tfirst
{
	Tstack* next;
	int count;
	Tstack* last;

};


Tfirst* createlist();
void push(Tfirst* st1,string data);
void pop(Tfirst* st1);

#endif
Пробовал определение структур переносить в structs_definition.h, тоже гора ошибок
danil123 вне форума Ответить с цитированием
Старый 13.06.2014, 13:31   #8
_Bers
Старожил
 
Регистрация: 16.12.2011
Сообщений: 2,329
По умолчанию

danil123

Есть хэдер, в котором объявлены прототипы:
structs_declaration.h

Код:
#ifndef qwe
#define qwe 10

#include<iostream>
using namespace std;
struct Tstack
{
	string data;
	Tstack* next;
	Tstack* prev;
};

struct Tfirst
{
	Tstack* next;
	int count;
	Tstack* last;

};


Tfirst* createlist();
void push(Tfirst* st1,string data);
void pop(Tfirst* st1);

#endif
Есть спп, в котором объявлена реализация:
structs_definition.сpp

Код:
#include"structs_declaration.h"

Tfirst* createlist()
{
	Tfirst *st1=new Tfirst;
	st1->count=0;
	st1->next=0;
	return st1; 

}
void push(Tfirst* st1,string data)	
{
	st1->count+=1;
	Tstack* newstack=new Tstack;
	newstack->prev=st1->last;
	newstack->data=data;
	newstack->next=0;
	st1->last=newstack;

}

void pop(Tfirst* st1)
{
	Tstack* stack= st1->last;
	st1->count-=1;
	st1->last=stack->prev;

}
Особое внимание обратите на то, что реализация находится в файле спп.
Это - важно.

Есть потребители:

1.cpp:
Код:
#include "structs_declaration.h"
// использование функции
2.cpp:
Код:
#include "structs_declaration.h"
// использование функции


зы: правилом хорошего тона считается называеть спп файл реализации так же, как h файл деклараций.

Например, если декларация находится в файле defenition.h
То реализация находится в файле defenition.cpp

Такой код проще читать стороннему человеку. А ИДЕ проще понять в каком файле находится реализация деклараций.

Последний раз редактировалось _Bers; 13.06.2014 в 13:34.
_Bers вне форума Ответить с цитированием
Старый 13.06.2014, 13:41   #9
danil123
Пользователь
 
Регистрация: 06.07.2012
Сообщений: 80
По умолчанию

вроде заработало, спасибо!
danil123 вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Использование структур и функций. Daro Помощь студентам 5 05.11.2012 09:10
массив структур из файла 123456789igor Общие вопросы C/C++ 3 02.01.2012 16:10
Чтение структур из файла (С++) Сольвейг Помощь студентам 5 27.12.2011 00:03
Два XL файла, данные 1-го файла являются частью другого в формуле 2-го Кот Microsoft Office Excel 2 14.08.2007 16:56
два TMediaPlayer и два AVI-файла zeleniy Компоненты Delphi 0 01.06.2007 14:14