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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 12, средняя оценка - 4.67
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 750
#1

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

01.08.2010, 01:21. Просмотров 1427. Ответов 15
Метки нет (Все метки)

Здравствуйте. Такая вот проблема:
мой проект состоит из нескольких .срр файлов и одного .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 ==========
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
01.08.2010, 01:21
Здравствуйте! Я подобрал для вас темы с ответами на вопрос почему выскакивают ошибки (C++):

При компиляции выскакивают ошибки - C++
Здравствуйте, помогите пожалуйста исправить ошибки в коде (фото). #include "Finalexam.h" #include <iostream> using namespace std; ...

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

Почему нет ошибки? - C++
Добрый вечер. В MS VC++ случайно написал нечто подобное: //... int a, b, c; //... a = b; + c; и скомпилировал. Самое...

Почему нет ошибки? - C++
Метод IsEmpty() класса указываю константным. Но в нем я изменяю состояние класса. Почему нет ошибки, а только предупреждение? ...

Почему компилятор выдаёт ошибки? - C++
Почему компилятор выдаёт ошибки? #include <iostream.h> #include <conio.h> Void main () { int a, b, c; std::cin >> a >> b...

Найти ошибки почему неправильно считает! - C++
Тут нужно для х изменяющегося от a до b с шагом (b-a)/k, где (k=10), вычислить функцию f(x), используя ее разложение в степенной ряд в двух...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 1
01.08.2010, 01:41 #2
попробуйте добавить защиту от повторного включения заголовков

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

но все таки без кода сложно судить.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.08.2010, 02:25 #7
fasked, А зачем как static кстати? У меня и без статика все работает с раздельной компиляцией программ
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
иначе линковщик не может определить к какой из двух или более переменных хочет обратиться программист.
1
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,700
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;
}
почему выскакивают ошибки
1
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
01.08.2010, 03:36 #10
fasked, К классам и их реализации я так понимаю сие не относится?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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
Реализация класса и объявление переменной все таки разные вещи, тут немного другое.

Не по теме:

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



Здравствуйте. Такая вот проблема:
надеюсь, теперь вы поняли в чем проблема?
1
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 750
01.08.2010, 10:59  [ТС] #12
Цитата Сообщение от fasked Посмотреть сообщение
надеюсь, теперь вы поняли в чем проблема?
Нет, и еще не ясно почему "нельзя" объявлять глобальные переменные в файле заголовке?
0
fasked
Эксперт С++
4936 / 2516 / 180
Регистрация: 07.10.2009
Сообщений: 4,311
Записей в блоге: 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.
а лучше вообще обойтись без глобальных переменных.
1
jonson
232 / 205 / 61
Регистрация: 18.03.2010
Сообщений: 750
01.08.2010, 11:55  [ТС] #14
Ладно fasked, спасибо за пояснения, буду строить проект по другому.
А на счет глобальных переменных ты прав, но иногда с ними проще.
Все в принципе понял, вот разве что почему никакого толку нет от препроцессора в моем .h
C++
1
2
3
4
5
6
#ifndef HEADER_H
#define HEADER_H
 
/* содержимое h файла */
 
#endif
0
easybudda
Модератор
Эксперт CЭксперт С++
9624 / 5572 / 946
Регистрация: 25.07.2009
Сообщений: 10,700
01.08.2010, 12:24 #15
Цитата Сообщение от fasked Посмотреть сообщение
а лучше вообще обойтись без глобальных переменных.
С глобальными переменными, на сколько я понял, ситуация примерно, как с оператором goto - без крайней на то необходимости лучше действительно не использовать...

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

Почему ошибки? Консольное приложение (MFC) - C++
Создал новый проект Win32, выбрал консольное приложение с MFC. У меня было стойкое ощущение того, что никаких ошибок быть не должно, но...

Где здесь ошибки? Почему крашится? - C++
#include &quot;stdafx.h&quot; #include &lt;math.h&gt; #include &lt;iostream&gt; #define MAX_DEGREE 340 #define MAX_LINE 4 using namespace std; ...

Почему ошибки Extra parameter in call - C++
#include&lt;stdio.h&gt; #include&lt;conio.h&gt; #include&lt;math.h&gt; #define pi 3.14159 //Прототип функцій: float Vusota (float hc); float...

Почему выводятся все ошибки, а не одна? - C++
Вводим в &quot;размер массива&quot; отрицательное число. Получаем сразу все ошибки(отрицательное значение, слишком маленькое/большое..), а не одну...


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
01.08.2010, 12:24
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru