![]() |
Модераторы: Daevaorn |
![]() ![]() ![]() |
|
Гость05 |
|
|||
Unregistered |
Привет, Alll!
как объявить функцию которая была бы видна из любой части проекта состоящего из нескольких классов => несколько хэдеров и сипипишников, каковы ньюансы подобного объявления? Спасибо. |
|||
|
||||
Denn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: нет Всего: 2 |
В одном из хедеров делаешь предварительное объявление:
void func(); В cpp ее описываешь void func() { } хедер добавляешь где надо вызывать функцию. |
|||
|
||||
mr.Anderson |
|
||||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ага. К примеру:
Все. Хедер готов. Теперь в основной программе:
Ну как, помогло? ![]() |
||||
|
|||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
sim7
Ага, а теперь воткни свой хеадер не в один файлик, а, например, в два. И любуйся. Для КЛАССОВ эквивалентные определения допускаются, а вот функций у тебя получится две в объектниках разных. Именно для того хеадеры и предназначены, чтобы отделять объявление и определение. |
|||
|
||||
Denn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: нет Всего: 2 |
Hroft
а какие объектики ты имеешь в виду? |
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Это файлы, сгенерированные компилятором после обработки единицы компиляции. Короче, то, что получается из .CPP и отдается линкеру. |
|||
|
||||
Denn |
|
|||
Шустрый ![]() Профиль Группа: Участник Сообщений: 143 Регистрация: 6.8.2005 Репутация: нет Всего: 2 |
поставь #pragma once и будет одна единица компиляции и одна функция.
|
|||
|
||||
Hroft |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 310 Регистрация: 20.10.2003 Где: Москва Репутация: нет Всего: 3 |
Ни разу ей не пользовался, но...
Если написать в его хеадере прагму, что, кстати, не сделано, то второй раз хеадер просто не включится, если он уже включен, ведь так? Если так, то ошибка не в этом, этой тут и быть не может... |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Вообще, я чаще вот так делаю (кстати, скажите, правильно или нет):
Я не имел возможности проверить, так ли. |
|||
|
||||
Selecter |
|
||||||
![]() Новичок Профиль Группа: Участник Сообщений: 3 Регистрация: 19.8.2005 Репутация: нет Всего: нет |
По-моему, вот так:
|
||||||
|
|||||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
А зачем define? Куда мне константа?
|
|||
|
||||
Mayk |
|
|||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
По хорошему это делается так
blahblah.h:
-------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
|||
|
||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Ух ты! Обалдеть! А пояснить можете?
1) Почему #define, а не #include? 2) Почему все помещено в #ifndef и #endif? Почему нельзя писать код хедера после #endif? 3) Где объявление класса - это тело хедера, так? |
|||
|
||||
Mayk |
|
||||||
![]() ^аВаТаР^ сообщение>> ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 2616 Регистрация: 22.5.2005 Где: за границей разум а Репутация: 45 Всего: 134 |
да
Потому что они служат для абсолютно разных целях - первый определяет макрос, за место второго встает тело указанного файла.
Потому что иначе они могут продублироваться, если ты заинклюдишь файл дважды. Компилятору это может не понравится. Увидев директиву #ifndef aaa, препроцессор проверит был ли установлен макрос aaa. Все остальное вплоть до #endif(или #else) будет отдано на съедение компилятору только в том случае, если он установлен не был. А в первом случае это так. Следующая строка определяет этот самый макрос. #endif означает конец ветвления. Далее файл подключается второй раз - увидев директиву #ifndef aaa, препроцессор проверит был ли установлен макрос aaa. Он уже был установлен, так что препроцессор пропустит всё до конца файла. Компилятор не получит двойного определения класса, все будут счастливы. Заместо #ifndef/#define/#endif можно использовать мелкософтофский #pragma once - в этом случае хедер будет обработан лишь один раз на компиляцию независимо от чего либо. Но это не решит проблемы, которую описал Hroft. Если ты объявишь ф-цию в хедере, который подключается из 1.cpp и 2.cpp, то ф-ция будет лежать в обоих объектных файлах - как в 1.obj, так и в 2.obj, так как компилирование 1.cpp НИКАК не связано с компилированием 2.cpp.Поэтому компилятор откомпилирует функцию дважды, ошибок не будет. Но вот на стадии линкования... Линкер видит, что в 1.obj есть ф-ция YOUR_FUNC и в 2.obj есть ф-ция с имененм YOUR_FUNC. Да к тому же они принимают одинаковые параметры, что совсем не допустимо. Если компоновщик увидит, что кто-то вызывает YOUR_FUNC, он не сможет определить какую именно YOUR_FUNC вызывают - из файла 1.obj, или из файла 2.obj. Поэтому он будет ругаться. -------------------- Здесь был кролик. Но его убили. Человеки < кроликов, йа считаю. |
||||||
|
|||||||
mr.Anderson |
|
|||
![]() iOS Lead Developer ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 3374 Регистрация: 20.12.2004 Где: далеко Репутация: нет Всего: 128 |
Так я запутался - что использовать: #include или #define?
А символы подчеркивания нужны перед именами файлов, как в вашем коде? А про повторы функций - а нельзя создать в хедере две функции с разными именами? И вызывать по разным именам? |
|||
|
||||
![]() ![]() ![]() |
Правила форума "С++:Общие вопросы" | |
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |