С Новым годом! Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.82/11: Рейтинг темы: голосов - 11, средняя оценка - 4.82
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750

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

01.08.2010, 01:21. Показов 2426. Ответов 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
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
01.08.2010, 01:21
Ответы с готовыми решениями:

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

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

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

15
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 01:41
попробуйте добавить защиту от повторного включения заголовков

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

но все таки без кода сложно судить.
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.08.2010, 02:25
fasked, А зачем как static кстати? У меня и без статика все работает с раздельной компиляцией программ
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 02:37
Цитата Сообщение от Lavroff Посмотреть сообщение
А зачем как static кстати?
чтобы переменная была видна только в пределах одного файла реализации.

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

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

вот кстати текст ошибки из MSVS2010:
Code
1
fatal error LNK1169: one or more multiply defined symbols found
иначе линковщик не может определить к какой из двух или более переменных хочет обратиться программист.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
01.08.2010, 03:00
а с какой целью вообще глобальные переменные в заголовочных файлах инициализировать?

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
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
01.08.2010, 03:36
fasked, К классам и их реализации я так понимаю сие не относится?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 10:34
Цитата Сообщение от 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);
Code
1
2
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
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
01.08.2010, 10:59  [ТС]
Цитата Сообщение от fasked Посмотреть сообщение
надеюсь, теперь вы поняли в чем проблема?
Нет, и еще не ясно почему "нельзя" объявлять глобальные переменные в файле заголовке?
0
Эксперт С++
 Аватар для fasked
5045 / 2624 / 241
Регистрация: 07.10.2009
Сообщений: 4,310
Записей в блоге: 5
01.08.2010, 11:15
Цитата Сообщение от jonson Посмотреть сообщение
Нет, и еще не ясно почему "нельзя" объявлять глобальные переменные в файле заголовке?
когда ты пишешь строку а-ля #include "file.h"
то фактически все содержимое заголовка вставляется в место включения. вот и получается, что ты вставил несколько одинаковых переменных в свой проект. того же самого эффекта можно достигнуть и без участия заголовочных файлов

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

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


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

так что делай, как предложил easybudda.
а лучше вообще обойтись без глобальных переменных.
1
 Аватар для jonson
240 / 213 / 84
Регистрация: 18.03.2010
Сообщений: 750
01.08.2010, 11:55  [ТС]
Ладно fasked, спасибо за пояснения, буду строить проект по другому.
А на счет глобальных переменных ты прав, но иногда с ними проще.
Все в принципе понял, вот разве что почему никакого толку нет от препроцессора в моем .h
C++
1
2
3
4
5
6
#ifndef HEADER_H
#define HEADER_H
 
/* содержимое h файла */
 
#endif
0
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
 Аватар для easybudda
12843 / 7592 / 1766
Регистрация: 25.07.2009
Сообщений: 13,973
01.08.2010, 12:24
Цитата Сообщение от fasked Посмотреть сообщение
а лучше вообще обойтись без глобальных переменных.
С глобальными переменными, на сколько я понял, ситуация примерно, как с оператором goto - без крайней на то необходимости лучше действительно не использовать...

Цитата Сообщение от jonson Посмотреть сообщение
почему никакого толку нет от препроцессора в моем .h
а какой Вы от него толк ждали?
0
01.08.2010, 12:31

Не по теме:

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

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.08.2010, 12:31
Помогаю со студенческими работами здесь

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

Почему выдает ошибки?
In function 'int main()': 10:14: error: 'gets' was not declared in this scope 11:35: error: 'strlen' was not declared in this scope ...

Почему выдает эти ошибки?
error: invalid types ‘float ’ for array subscript error: size of array ‘arr’ has non-integral type ‘float’ #include &lt;iostream&gt; ...

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

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


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru