![]() |
|
Модераторы: Daevaorn |
![]()
|
|
| mur88 |
|
|||
|
Шустрый ![]() Профиль Группа: Участник Сообщений: 81 Регистрация: 10.11.2007 Репутация: нет Всего: нет |
Хотел бы добавить в программу свой инклуд в котором будут реализованы часто используемые мною функции
Возможно ли это сделать зная только сам язык программирования (В pascale это было возможно а в с++ не знаю) ??? Если да то с чего начинать ??? Если нет то почему ??? |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Да. С чтения любой книги по языку программирования по С++. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| bsa |
|
||||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 63 Всего: 196 |
myfile.h:
|
||||
|
|||||
| Dims |
|
|||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Это не тоже самое, что в Паскале. В Си++ #include -- это директива так называемого препроцессора. Она просто вставляет текст указанного файла так, словно вы его сами туда впечатали. И делает это ПЕРЕД компиляцией.
В языке Си++ различаются "описания" и "определения". Описание -- это просто (грубо говоря) указание типов. А определение -- это код программы. В h-файлах обычно размещаются описания. По правилам Си++ описаний одного и того же может в программе быть сколько угодно. И поэтому, инклюды можно повторять. Но кода (самого текста функций) там нет, так как по правилам Си++ код повторять нельзя. Это с виду похоже на Паскаль, но по сути другое. Для работы иметь h-файл недостаточно. Нужен ещё откомпилированный файл (lib или obj) (или неоткомпилировнный cpp), в которых содержится код. Этот файл должен просто лежать в папке с библиотеками или в папке с текущим проектом и явно из программы не вызывается. Допустим, если ты напишешь свои функции, то в h-файле ты поместишь просто её описание (прототип), то есть, информацию о том, как функция называется и какие параметры она принимает и какой тип возвращает. Сам код функции тебе надо поместить в отдельный cpp файл и откомпилировать (получить obj). h-файл положить надо в папку включений, а obj-файл в папку библиотек. Если поставлять кому-то, то оба файла. |
|||
|
||||
| JackYF |
|
|||
![]() полуавантюрист ![]() ![]() ![]() ![]() Профиль Группа: Участник Сообщений: 5814 Регистрация: 28.8.2004 Где: страна тысячи озё р Репутация: 18 Всего: 162 |
||||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
у вас просто разное понимание терминов я думаю, под описанием Dims имел в виду объявление (потому что определение у него тоже фигурирует) Добавлено @ 10:12
не совсем верно код в include-файлах может быть (и сей факт довольно часто используется) важно, чтобы все функции / переменные, определенные в нем были или inline (С или С++) (только для функций), или статическими (С), или принадлежали анонимному namespace ' у (С++), иными словами имели локальную в пределах модуля область видимости Это сообщение отредактировал(а) MAKCim - 12.11.2007, 10:16 -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Термина "описание" в С++ вроде вообще нет Добавлено через 32 секунды И есть one definition rule(ODR), но нету one declaration rule -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
ну я и говорю, разное понимание (aka перевод) терминов -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Lazin |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3820 Регистрация: 11.12.2006 Где: paranoid oil empi re Репутация: 41 Всего: 154 |
Вобще в инклудах можно тупо писать код, если в классе, который описан в h файле реализован метод то он становится inline автоматически
вобще я много раз видел как код писали вот так-вот, самый главный минус - тормозная компиляция(прекомпиляция вообще не возможна), помимо, компилятор ругается на то-что многие ф-ии - реализованные в объявлении класса он не может сделать их inline (если в функции есть цикл, или статические переменные). Другое дело шаблоны. Шаблонные классы надо писать целиком в заголовочных файлах, иначе будут проблемы с компоновкой. |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
не помню, в стандарте такое поведение описано? компилятор может их заинлайнить, но он не обязан этого делать (и не делает в GCC (без оптимизации по дефолту)) и уж тем более "ругаться" -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Описано, что ф-ции становятся inline, но нигде не написано, что inline-ф-ции обязаны встраиваться - это уже как компилятор решит. -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
несколько странно, не кажется? гораздо логичнее было бы так: если присутствует ключевое слово inline - функция (метод) встраиваемая со всеми вытекающими нет - у компилятора развязаны руки для любой оптимизации я это к тому, что зачем вводить дополнительный пункт в стандарт, если в определении методов можно напрямую указывать inline некоторая избыточность получается -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
| Dims |
|
||||||
![]() Эксперт ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 1016 Регистрация: 21.11.2006 Репутация: 1 Всего: 11 |
Да, всё правильно, под "описанием" я имел в виду declaration.
Да, согласен с поправкой про inline. Что было со статическими в Си не помню, а вот переменные из безымянного пространства, что-то не согласен. Вот такой код
Вызвал у меня ошибку: Error 1 error C2086: 'int a' : redefinition d:\users\dims\design\visualstudio\tests\tests\tests.cpp 9 То есть, в h-файл его по-хорошему, включать нельзя, так как h-файл в принципе может быть включён несколько раз. А вот такой код
откомпилировался нормально. |
||||||
|
|||||||
| archimed7592 |
|
|||
![]() Архимед ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 2531 Регистрация: 12.6.2004 Где: Moscow Репутация: 58 Всего: 93 |
Нет не кажется. Есть ф-ции, заинлайнить которые невозможно.
Насколько я понимаю, для современных компиляторов это подсказка, которая отключает у него часть эвристики, решающей делать ли ф-цию inline(т.е., к примеру решение будет приниматься исключительно исходя из размера ф-ции[если, конечно, её вообще заинлайнить возможно]), или увеличивает вероятность, что эвристика примет решение заинлайнить ф-ции(опять же, если это вообще возможно). -------------------- If you have an apple and I have an apple and we exchange apples then you and I will still each have one apple. But if you have an idea and I have an idea and we exchange these ideas, then each of us will have two ideas. © George Bernard Shaw |
|||
|
||||
| MAKCim |
|
|||
![]() Воін дZэна ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 5644 Регистрация: 10.12.2005 Где: Менск, РБ Репутация: 52 Всего: 207 |
и я о том же зачем у компилятора отнимать его хлеб?
inline же не обязывает обязательно использовать встраивание лишь рекомендует Добавлено через 2 минуты и 37 секунд Dims, при чем тут твой код и анонимные пространства имен? двойное определение даже статических (или в анонимном пространстве имен) глобальных переменных в одном модуле не допускается -------------------- Ах, у елі, ах, у ёлкі, ах, у елі злыя волкі © |
|||
|
||||
![]()
|
| Правила форума "С++:Общие вопросы" | |
|
|
Добро пожаловать!
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Общие вопросы | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |