Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Глобальная функция, как объявить чтоб везде... 
:(
    Опции темы
Гость05
Дата 17.8.2005, 10:15 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Привет, Alll!

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

Спасибо.
  Вверх
Denn
Дата 17.8.2005, 11:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 6.8.2005

Репутация: нет
Всего: 2



В одном из хедеров делаешь предварительное объявление:
void func();
В cpp ее описываешь
void func()
{
}
хедер добавляешь где надо вызывать функцию.

PM MAIL ICQ   Вверх
mr.Anderson
Дата 18.8.2005, 18:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Ага. К примеру:
Код

//Это пишем заголовочный файл (хедер)
void YOUR_FUNC(it_arguments);
//Дальше еще прототипы других функций, если надо
//Затем пишем саму функцию:
void YOUR_FUNC(int arg1,char arg2)
{
//Тут пишем тело функции
}

Все. Хедер готов. Теперь в основной программе:
Код

//Это - основная программа

#include <имя_хедера.h>
void main()
{
//Тело главной функции
...
//Затем вызов встроенной в хедер функции:
YOUR_FUNC(23,'a');
}

Ну как, помогло? smile


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Hroft
Дата 19.8.2005, 11:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



sim7
Ага, а теперь воткни свой хеадер не в один файлик, а, например, в два. И любуйся. Для КЛАССОВ эквивалентные определения допускаются, а вот функций у тебя получится две в объектниках разных. Именно для того хеадеры и предназначены, чтобы отделять объявление и определение.
PM MAIL ICQ   Вверх
Denn
Дата 19.8.2005, 12:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 6.8.2005

Репутация: нет
Всего: 2



Hroft
а какие объектики ты имеешь в виду?
PM MAIL ICQ   Вверх
Hroft
Дата 19.8.2005, 13:29 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Цитата(Hroft @ 19.8.2005, 11:16)
объектниках

Это файлы, сгенерированные компилятором после обработки единицы компиляции. Короче, то, что получается из .CPP и отдается линкеру.
PM MAIL ICQ   Вверх
Denn
Дата 19.8.2005, 14:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 143
Регистрация: 6.8.2005

Репутация: нет
Всего: 2



поставь #pragma once и будет одна единица компиляции и одна функция.
PM MAIL ICQ   Вверх
Hroft
Дата 19.8.2005, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 310
Регистрация: 20.10.2003
Где: Москва

Репутация: нет
Всего: 3



Ни разу ей не пользовался, но...
Если написать в его хеадере прагму, что, кстати, не сделано, то второй раз хеадер просто не включится, если он уже включен, ведь так? Если так, то ошибка не в этом, этой тут и быть не может...
PM MAIL ICQ   Вверх
mr.Anderson
Дата 19.8.2005, 16:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Вообще, я чаще вот так делаю (кстати, скажите, правильно или нет):
Код

#ifndef my_header.h
#include <my_header.h>
#endif

Я не имел возможности проверить, так ли.


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Selecter
Дата 19.8.2005, 17:10 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 3
Регистрация: 19.8.2005

Репутация: нет
Всего: нет



Цитата(sim7 @ 19.8.2005, 16:05)
Вообще, я чаще вот так делаю (кстати, скажите, правильно или нет):
Код

#ifndef my_header.h
#include <my_header.h>
#endif

Я не имел возможности проверить, так ли.

По-моему, вот так:
Код

#ifndef MY_HEADER_H
#include <my_header.h>
#define MY_HEADER_H
#endif

PM MAIL   Вверх
mr.Anderson
Дата 19.8.2005, 18:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



А зачем define? Куда мне константа?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 19.8.2005, 18:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



По хорошему это делается так
blahblah.h:
Код

#ifndef __blahblah_h
#define __blahblah_h
class Blahblah
{
   blah blahblah();
   blah blahblah(blah bla);
};
#endif





--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 19.8.2005, 18:26 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Ух ты! Обалдеть! А пояснить можете?
1) Почему #define, а не #include?
2) Почему все помещено в #ifndef и #endif? Почему нельзя писать код хедера после #endif?
3) Где объявление класса - это тело хедера, так?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Mayk
Дата 19.8.2005, 19:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134



Цитата(sim7 @ 19.8.2005, 22:26)
3) Где объявление класса - это тело хедера, так?

да
Цитата(sim7 @ 19.8.2005, 22:26)
Почему #define, а не #include?

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

Цитата(sim7 @ 19.8.2005, 22:26)
Почему все помещено в #ifndef и #endif? Почему нельзя писать код хедера после #endif?

Потому что иначе они могут продублироваться, если ты заинклюдишь файл дважды. Компилятору это может не понравится.
Увидев директиву #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. Поэтому он будет ругаться.



--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
mr.Anderson
Дата 19.8.2005, 21:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


iOS Lead Developer
****


Профиль
Группа: Участник Клуба
Сообщений: 3374
Регистрация: 20.12.2004
Где: далеко

Репутация: нет
Всего: 128



Так я запутался - что использовать: #include или #define?
А символы подчеркивания нужны перед именами файлов, как в вашем коде?
А про повторы функций - а нельзя создать в хедере две функции с разными именами? И вызывать по разным именам?


--------------------
user posted image

user posted image
PM MAIL ICQ Skype   Вверх
Страницы: (3) Все [1] 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0884 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.