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

C++

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.79
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
#1

*.h - C++

17.07.2009, 14:14. Просмотров 1673. Ответов 14
Метки нет (Все метки)

Зачем эти файлы, и как с ними работать???
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
17.07.2009, 14:20     *.h #2
Это заголовочные файлы. Они нужны, когда ты работаешь с много файловыми проектами. Если функция находиться в файле (допустим) 1.cpp а тебе надо вызвать её из файла 2.cpp, то ты должен сообщить компилятору, что эта функция есть и её определение посредством хеадеров.
ISergey
Maniac
Эксперт С++
1373 / 884 / 52
Регистрация: 02.01.2009
Сообщений: 2,653
Записей в блоге: 1
17.07.2009, 14:36     *.h #3
Цитата Сообщение от cristaloleg Посмотреть сообщение
Зачем эти файлы, и как с ними работать???
А книги читать мы больше не умеем?
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.07.2009, 14:47     *.h #4
Цитата Сообщение от RazorQ Посмотреть сообщение
. Если функция находиться в файле (допустим) 1.cpp а тебе надо вызвать её из файла 2.cpp, то ты (должен) можешь сообщить компилятору, что эта функция есть и её определение посредством хеадеров.
C++
1
2
3
4
5
// main.cpp
int main() {
  void fcn();
  fcn();
}
C++
1
2
//file.cpp
void fcn()  {}
Цитата Сообщение от ISergey Посмотреть сообщение
А книги читать мы больше не умеем?
в книгах написано о том, что определения нужно в cpp файлах хранить, а объявления в h-файлах. зачем нужны h-файлы - в книгах умалчивают.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,924
Записей в блоге: 26
17.07.2009, 14:51     *.h #5
В твоём коде file.cpp я добавлю прпаметр к функции fcn (указатель, например), но main.cpp трогатьне буду (забал, например). После чего у тебя всё скомпилится нормально, но программа работать не будет
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.07.2009, 14:56     *.h #6
Цитата Сообщение от Evg Посмотреть сообщение
. После чего у тебя всё скомпилится нормально, но программа работать не будет
программа работать не будет, т.к. она не слинкуется.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,924
Записей в блоге: 26
17.07.2009, 14:58     *.h #7
Кстати, да, в си++ не слинкуется. Зайдём с другой стороны. Сделай так, чтобы функция была void, но в main опиши, будто-бы она возвращает поинтер, а потом с этим поинтером попробуй что-то сделать
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.07.2009, 15:05     *.h #8
Цитата Сообщение от Evg Посмотреть сообщение
. Сделай так, чтобы функция была void, но в main опиши, будто-бы она возвращает поинтер
так что-ли?
C++
1
2
//file.cpp
void fcn()  {}
C++
1
2
3
4
5
// main.cpp
int main() {
  void *fcn();
  fcn();
}
ошибка линковки
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,924
Записей в блоге: 26
17.07.2009, 15:09     *.h #9
И что пишет? На g++ нормально линкуется, потому как тип возвращаемфой функции не участвует в процессе манглирования имени (хотя под виндами возможно подругому)

Добавлено через 1 минуту 36 секунд
Просто по другому тяжело привести пример, чтобы человек реально ОСОЗНАЛ на кой оно нужно
zim22
depict1
276 / 141 / 2
Регистрация: 11.07.2009
Сообщений: 606
17.07.2009, 15:23     *.h #10
Цитата Сообщение от Evg Посмотреть сообщение
И что пишет?
MSVC 2008
1>Linking...
1>288.obj : error LNK2019: unresolved external symbol "void * __cdecl fcn(void)" (?fcn@@YAPAXXZ) referenced in function _main
1>288.exe : fatal error LNK1120: 1 unresolved externals
Цитата Сообщение от Evg Посмотреть сообщение
На g++ нормально линкуется
таки да, нормально.
Цитата Сообщение от Evg Посмотреть сообщение
Просто по другому тяжело привести пример, чтобы человек реально ОСОЗНАЛ на кой оно нужно
согласен, оно не нужно. но я как раз сейчас механизм линковки в С++ изучаю так что чем больше извращений кода - тем лучше.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,924
Записей в блоге: 26
17.07.2009, 16:03     *.h #11
Ну или вот такой пример:

C++
1
2
3
4
int main() {
  void fcn (int);
  fcn (1);
}
C++
1
void fcn (int) {}
Было вот так. И всё работало. Далее тебе надо поменять параметр функции fcn с int'а на long. Тебе нужно поправить в функции, а потом в месте использования (main). А если у тебя было 50 файлов и в кажом по 30 использований - то ещё в 1500 местах. А если ты описание вынесешь в *.h файл, то править только в двух местах - в самой функции и её объявлении. Всё остальное срастётся автоматически

Наверное, следует пояснить, что такое директива #include. Почитай вот тут
Для чего нужен define?
Для чего нужен define?

Добавлено через 47 секунд
Цитата Сообщение от zim22 Посмотреть сообщение
но я как раз сейчас механизм линковки в С++ изучаю так что чем больше извращений кода - тем лучше.
Линковка - это механизм, никак не привязанный к языку
TGrey[WoLf]
39 / 39 / 1
Регистрация: 14.09.2008
Сообщений: 685
17.07.2009, 16:08     *.h #12
Во первых! Книги читать? Хах... тьфу! Это прошлый век
Потом, что это за метод такой void который возвращает указатель(поинтер)?? Еще в прошлом веке, дойдя до главы Функции, было написано, что тип void используется когда функция ничего не возвращает, а у вас она еще и указатель возвращает))

Насчет хедера. У тебя есть большая программа с множеством функций. Все тулить в один срр сильно круто да и запутаться можно и искать сложно. Для этого ты создаешь хедер тулишь все функции в него и подключаешь этот хедер к своему срр. Таким образом программа у тебя в одном файле функции в другом.
Evg
Эксперт CАвтор FAQ
17543 / 5781 / 370
Регистрация: 30.03.2009
Сообщений: 15,924
Записей в блоге: 26
17.07.2009, 16:17     *.h #13
Цитата Сообщение от TGrey[WoLf] Посмотреть сообщение
Во первых! Книги читать? Хах... тьфу! Это прошлый век
Потом, что это за метод такой void который возвращает указатель(поинтер)?? Еще в прошлом веке, дойдя до главы Функции, было написано, что тип void используется когда функция ничего не возвращает, а у вас она еще и указатель возвращает))
Ты вообще понял, для чего создавался пример? Для моделирования ошибки в исходниках, которую не ловит компилятор
RazorQ
577 / 344 / 9
Регистрация: 06.02.2009
Сообщений: 1,386
17.07.2009, 16:20     *.h #14
Цитата Сообщение от TGrey[WoLf
Потом, что это за метод такой void который возвращает указатель(поинтер)?? Еще в прошлом веке, дойдя до главы Функции, было написано, что тип void используется когда функция ничего не возвращает, а у вас она еще и указатель возвращает))
Вы именно тот кому ОБЯЗАТЕЛЬНО читать книги, потому что там написано, что void* это указатель на "любой" тип. То есть из него можно получить указатель на любой тип, используя привидения типа
cristaloleg
148 / 49 / 1
Регистрация: 21.12.2008
Сообщений: 961
17.07.2009, 19:04  [ТС]     *.h #15
Спасибо всем!!!

Всё таки книги хорошая вещь!!!
Yandex
Объявления
17.07.2009, 19:04     *.h
Ответ Создать тему
Опции темы

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