Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> немного о хеадерах 
V
    Опции темы
apook
Дата 20.9.2007, 12:29 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Линкер выдает ошибку --
Error: _DAT defined in module main.cpp is duplicated in module dat.cpp

Суть такова:
В заголовочном файле dat.h есть структура DAT( там же заполняется ), в файле main.cpp включен файл dat.h и в dat.cpp тоже включен файл dat.h соответственно.
Ошибка потому что тип DAT обьявляется дважды, пачиму так smile? убедительная просьба разжувать
30 минут непоняток....


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Daevaorn
Дата 20.9.2007, 12:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(apook @  20.9.2007,  13:29 Найти цитируемый пост)
Линкер выдает ошибку --

если так, то:
Цитата(apook @  20.9.2007,  13:29 Найти цитируемый пост)
В заголовочном файле dat.h есть структура DAT( там же заполняется

заполнять её надо один раз. а у тебя получается два.
PM MAIL WWW   Вверх
GrayCardinal
Дата 20.9.2007, 12:41 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



apook
Можно в файле main.cpp записать макрос (перед включением dat.h), к примеру :
#define MAIN_CPP
а в 
dat.h
#ifdef MAIN_CPP
(заполняем)
#else
(просто объявляем)
#endif


Это сообщение отредактировал(а) GrayCardinal - 20.9.2007, 12:41


--------------------
PM MAIL WWW   Вверх
Fazil6
Дата 20.9.2007, 12:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1653
Регистрация: 3.5.2006
Где: Минск

Репутация: 35
Всего: 60



Цитата(apook @  20.9.2007,  12:29 Найти цитируемый пост)
Ошибка потому что тип DAT обьявляется дважды, пачиму так ? убедительная просьба разжувать30 минут непоняток....

ну чего тут непонятного? 2 раза одна и таже переменная определяется. Убирать ее определение из хедера
PM MAIL   Вверх
apook
Дата 20.9.2007, 12:46 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Дело в том что она тока там и определяется(то бишь в хеадере)

так поправки:
структура такая --

struct 

    char Ы[ 3 ][ 1 ]; //идентификаторы
    int Г;
    } DAT={
    { "\x1", "\x1", "\x1" },
    { 25 }
    };

надо чтоб эта структура заполнялась только в файле dat.h и именно таким способом


--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
GrayCardinal
Дата 20.9.2007, 12:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



apook
Именно таким способом не прокатит  smile

Добавлено через 1 минуту и 2 секунды
ЗЫ
и объявляется дважды НЕ ТИП, а ПЕРЕМЕННАЯ "DAT".


--------------------
PM MAIL WWW   Вверх
apook
Дата 20.9.2007, 13:06 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата(GrayCardinal @  20.9.2007,  12:49 Найти цитируемый пост)
и объявляется дважды НЕ ТИП, а ПЕРЕМЕННАЯ "DAT"
 Да это понятно там опечатка, но почему не прокатит не понятно я с этим не согласен, п о ч е м у у у???



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Daevaorn
Дата 20.9.2007, 13:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 2155
Регистрация: 29.11.2004
Где: Москва

Репутация: 51
Всего: 70



Цитата(apook @  20.9.2007,  14:06 Найти цитируемый пост)
п о ч е м у у у???

п о т о м у ч т о  в С + + т а к н е л ь з я! Определять переменные нужно в cpp файле, а чтобы они были видны не только там есть слово extern. читай доки!smile
PM MAIL WWW   Вверх
apook
Дата 20.9.2007, 13:26 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



c extern все понятно
Цитата(Daevaorn @  20.9.2007,  13:10 Найти цитируемый пост)
Определять переменные нужно в cpp файле
 О, а как сделать? Хотелось заполнить сразу при обьявлении...



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
archimed7592
Дата 20.9.2007, 13:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



Цитата(apook @  20.9.2007,  13:06 Найти цитируемый пост)
Да это понятно там опечатка, но почему не прокатит не понятно я с этим не согласен, п о ч е м у у у???

Потому что header - это НЕ отдельный модуль, а всего лишь кусочек другого модуля. В твоём случае этот кусочек фигурирует аж в двух модулях(можешь с тем же успехом убрать include и руками скопировать содержимое своего хэдера в оба модуля), как и дважды фигурирует определение переменной DAT. Так понятно?


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
apook
Дата 20.9.2007, 13:59 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата(archimed7592 @  20.9.2007,  13:34 Найти цитируемый пост)
Так понятно?
 Но ведь дело в том что так и надо делать( по правильному, соответственно в main.cpp и функция int main() так что я не могу в этом модуле не включить и в нем dat.h так как из main я пользуюсь данными из структуры DAT), не прокатывает только заполнение структуры при ее обьявлении... я специально вытащил ее из класса только для того чтоб заполнять при обьявлении, в общем стоял перед выбором заполнять ее в конструкторе или таким способом, польстился чето на второй



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
GrayCardinal
Дата 20.9.2007, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Фигасе
****


Профиль
Группа: Завсегдатай
Сообщений: 3039
Регистрация: 9.11.2003

Репутация: 2
Всего: 58



Цитата

специально вытащил ее из класса только для того чтоб заполнять при обьявлении, в общем стоял 
перед выбором заполнять ее в конструкторе или таким способом, польстился чето на второй

Ыыыы. LOL.


--------------------
PM MAIL WWW   Вверх
Earnest
Дата 21.9.2007, 19:28 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

Репутация: 53
Всего: 183



apook, так и заполняй себе при объявлении на здоровье. Только отдели мух от супа, т.е. объявление типа от объявления переменной. Первое - в хедер, второе - в cpp.
А не нравится - все претензии к Страуструпу - это он, гад, напридумал... 
А нет, это даже Керниган с прочими праотцами С...
smile  smile  smile 



--------------------
...
PM   Вверх
archimed7592
  Дата 21.9.2007, 19:38 (ссылка) |  (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Архимед
****


Профиль
Группа: Завсегдатай
Сообщений: 2531
Регистрация: 12.6.2004
Где: Moscow

Репутация: 58
Всего: 93



apook, не парь мозги ни себе ни нам. Вот тебе пример(хотя их на форуме десятки):
Код

// dat.h
extern int x;

// dat.cpp
int x = 75; // определяем и инициализируем здесь(только в одном месте)

// module1.cpp
#include "dat.h"
void f1()
{ std::cout << x << std::end; }

// module2.cpp
#include "dat.h"
void f2()
{ std::clog << x << std::end; }

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


--------------------
If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas.
© George Bernard Shaw
PM Jabber   Вверх
apook
Дата 22.9.2007, 02:43 (ссылка)    | (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 794
Регистрация: 12.7.2006

Репутация: 9
Всего: 23



Цитата(archimed7592 @  21.9.2007,  19:38 Найти цитируемый пост)
// dat.hextern int x;// dat.cppint x = 75; // определяем и инициализируем здесь(только в одном месте)

Ну что-за пример! я б не додумался до такого
Заполнять при обьявлении имелось ввиду напр:
Код

char *str="Строка";

проделать сие в хеадере как я теперь понял нельзя....



--------------------
Мои руки из дуба, голова из свинца ну и пусть ...
PM MAIL   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.1073 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.