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

почему выскакивают ошибки - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
01.08.2010, 01:21     почему выскакивают ошибки #1
Здравствуйте. Такая вот проблема:
мой проект состоит из нескольких .срр файлов и одного .h файла.
В .h файле находятся все глобальные переменные и прототипы функций
Не пойму почему выскакивают ошибки:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
1>Создание кода...
1>Компоновка...
1>Font.obj : error LNK2005: "struct HWND__ * hMainWnd" (?hMainWnd@@3PAUHWND__@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "class Reestr Reestr" (?Reestr@@3V0@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct tagLOGFONTA fontsec" (?fontsec@@3UtagLOGFONTA@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct HWND__ * h_count" (?h_count@@3PAUHWND__@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct HWND__ * minute" (?minute@@3PAUHWND__@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct HWND__ * h" (?h@@3PAUHWND__@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct HWND__ * h_edit" (?h_edit@@3PAUHWND__@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct HWND__ * parol" (?parol@@3PAUHWND__@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "struct tagLOGFONTA font" (?font@@3UtagLOGFONTA@@A) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "char * szIconName" (?szIconName@@3PADA) уже определен в kiri_timer.obj
1>Font.obj : error LNK2005: "char * szIconName2" (?szIconName2@@3PADA) уже определен в kiri_timer.obj
1>C:\_VS 2008\kiril_timer\Debug\kiril_timer.exe : fatal error LNK1169: обнаружен многократно определенный символ - один или более
1>Журнал построения был сохранен в "file://c:\_VS 2008\kiril_timer\kiril_timer\Debug\BuildLog.htm"
1>kiril_timer - ошибок 12, предупреждений 3
========== Построение: успешно: 0, с ошибками: 1, без изменений: 0, пропущено: 0 ==========
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 01:41     почему выскакивают ошибки #2
попробуйте добавить защиту от повторного включения заголовков

C
1
2
3
4
5
6
#ifndef HEADER_H
#define HEADER_H
 
/* содержимое h файла */
 
#endif
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
01.08.2010, 01:47  [ТС]     почему выскакивают ошибки #3
Цитата Сообщение от fasked Посмотреть сообщение
попробуйте добавить защиту от повторного включения заголовков
попробовал, но всё те же ошибки
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 01:49     почему выскакивают ошибки #4
выложите, пожалуйста, свой код. посмотрим в чем ошибка.
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
01.08.2010, 02:04  [ТС]     почему выскакивают ошибки #5
Просто сначала делал все одним файлом - все работало,
решил разделить и вот такой результат. Дело в том, что в целом весь код не мал, строк на 450 примерно.
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 02:22     почему выскакивают ошибки #6
если в .h файле есть функции или объявлены переменные, то их надо определять как static.
возможно в этом проблема.

но все таки без кода сложно судить.
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.08.2010, 02:25     почему выскакивают ошибки #7
fasked, А зачем как static кстати? У меня и без статика все работает с раздельной компиляцией программ
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 02:37     почему выскакивают ошибки #8
Цитата Сообщение от Lavroff Посмотреть сообщение
А зачем как static кстати?
чтобы переменная была видна только в пределах одного файла реализации.

например есть файл a.h
C++
1
2
3
#pragma once
 
int a = 0;
если подключить его к мейну то все будет нормально, но если еще есть файл a.cpp, или любой другой, который тоже подключает a.h, то уже получиться двойное объявление переменной. ошибка.
то есть если двай или более файла подключат такой заголовок - ошибка. если один - все хорошо.

static делает переменную видимой только в пределах одного файла. то есть в одном файле эта переменная будет изменяться и иметь одного значение, в другом другое.

вот кстати текст ошибки из MSVS2010:
Код
fatal error LNK1169: one or more multiply defined symbols found
иначе линковщик не может определить к какой из двух или более переменных хочет обратиться программист.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.08.2010, 03:00     почему выскакивают ошибки #9
а с какой целью вообще глобальные переменные в заголовочных файлах инициализировать?

myinc.h
C
1
2
3
4
5
6
7
8
#ifndef MY_INC_H
#define MY_INC_H 1
 
extern int myVariable;
 
int inc_by_variable(int);
 
#endif /* MY_INC_H */
mymodule.c
C
1
2
3
4
5
6
7
#include "myinc.h"
 
int myVariable = 10;
 
int inc_by_variable(int val){
    return val * myVariable;
}
myapp.c
C
1
2
3
4
5
6
7
8
#include <stdio.h>
#include "myinc.h"
 
int main(void){
    printf("myVariable = %d\n", myVariable);
    printf("inc_by_variable(13) = %d\n", inc_by_variable(13));
    return 0;
}
почему выскакивают ошибки
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
01.08.2010, 03:36     почему выскакивают ошибки #10
fasked, К классам и их реализации я так понимаю сие не относится?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 10:34     почему выскакивают ошибки #11
Цитата Сообщение от Lavroff Посмотреть сообщение
К классам и их реализации я так понимаю сие не относится?
C++
1
2
3
4
5
6
7
8
9
10
#pragma once
 
class A
{
public:  A(int t = 0) : val_(t) { };
         void f() { val_++; }
private: int val_;
};
 
A Aobj(5);
Код
Error 1 error LNK2005: "class A Aobj" (?Aobj@@3VA@@A) already defined in a.obj main.obj
Error 2 error LNK1169: one or more multiply defined symbols found
Реализация класса и объявление переменной все таки разные вещи, тут немного другое.

Не по теме:

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



Здравствуйте. Такая вот проблема:
надеюсь, теперь вы поняли в чем проблема?
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
01.08.2010, 10:59  [ТС]     почему выскакивают ошибки #12
Цитата Сообщение от fasked Посмотреть сообщение
надеюсь, теперь вы поняли в чем проблема?
Нет, и еще не ясно почему "нельзя" объявлять глобальные переменные в файле заголовке?
fasked
Эксперт C++
 Аватар для fasked
4924 / 2504 / 180
Регистрация: 07.10.2009
Сообщений: 4,306
Записей в блоге: 1
01.08.2010, 11:15     почему выскакивают ошибки #13
Цитата Сообщение от jonson Посмотреть сообщение
Нет, и еще не ясно почему "нельзя" объявлять глобальные переменные в файле заголовке?
когда ты пишешь строку а-ля #include "file.h"
то фактически все содержимое заголовка вставляется в место включения. вот и получается, что ты вставил несколько одинаковых переменных в свой проект. того же самого эффекта можно достигнуть и без участия заголовочных файлов

a.cpp
C++
1
int a = 0;

main.cpp
C++
1
2
3
4
5
int a = 0;
 
int main() 
{
}


итог тот же:
Код
error LNK2005: "int a" (?a@@3HA) already defined in a.obj
error LNK1169: one or more multiply defined symbols found
выше я уже говорил, что линковщик не понимает, к какой именно переменной ты захочешь обратиться в будущем. отсюда и ошибки.

так что делай, как предложил easybudda.
а лучше вообще обойтись без глобальных переменных.
jonson
 Аватар для jonson
231 / 204 / 61
Регистрация: 18.03.2010
Сообщений: 749
01.08.2010, 11:55  [ТС]     почему выскакивают ошибки #14
Ладно fasked, спасибо за пояснения, буду строить проект по другому.
А на счет глобальных переменных ты прав, но иногда с ними проще.
Все в принципе понял, вот разве что почему никакого толку нет от препроцессора в моем .h
C++
1
2
3
4
5
6
#ifndef HEADER_H
#define HEADER_H
 
/* содержимое h файла */
 
#endif
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
01.08.2010, 12:24     почему выскакивают ошибки #15
Цитата Сообщение от fasked Посмотреть сообщение
а лучше вообще обойтись без глобальных переменных.
С глобальными переменными, на сколько я понял, ситуация примерно, как с оператором goto - без крайней на то необходимости лучше действительно не использовать...

Цитата Сообщение от jonson Посмотреть сообщение
почему никакого толку нет от препроцессора в моем .h
а какой Вы от него толк ждали?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.08.2010, 12:31     почему выскакивают ошибки
Еще ссылки по теме:

Почему выводятся все ошибки, а не одна? C++
C++ Выскакивают ошибки конвертации одного типа в другой, как возможно это исправить?
C++ Почему нет ошибки?

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

Или воспользуйтесь поиском по форуму:
fasked
01.08.2010, 12:31     почему выскакивают ошибки
  #16

Не по теме:

Цитата Сообщение от easybudda Посмотреть сообщение
С глобальными переменными, на сколько я понял, ситуация примерно, как с оператором goto - без крайней на то необходимости лучше действительно не использовать...
а еще с рекурсией

Yandex
Объявления
01.08.2010, 12:31     почему выскакивают ошибки
Ответ Создать тему
Опции темы

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