![]() |
Модераторы: bsa |
![]() ![]() ![]() |
|
WiND |
|
||||||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
Сорри, заезжанная тема, но несмотря на то, что я прочитал много и все делаю по правилам,у меня не выходит)
к делу: Файлы: Client.h/Client.cpp, MyFuncs.h, main.cpp содержание: Client.h:
Client.cpp:
MyFuncs.h:
main.cpp:
даже в main.cpp добавил #pragma once ) пробовал и другой способ :#ifndef xxx #define xxx #endif Ошибки:
даже в main.cpp добавил #pragma once ) пробовал и другой способ :#ifndef xxx #define xxx #endif Вот что не так?! Мне файл MyFuncs.h в дальнейшем почти везде понадобится, а подключить получается тольк однажды. будто не работает #ifndef и #pragma once |
||||||||||
|
|||||||||||
xvr |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Комодератор Сообщений: 7046 Регистрация: 28.8.2007 Где: Дублин, Ирландия Репутация: 35 Всего: 223 |
Это не стражи виноваты - они работают, иначе все развалилось бы еще на этапе компиляции, а не линковки. Это повторное определение функций (из .h) файла в нескольких единицах трансляции.
Добавь inline в их определение
|
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
||||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
Разбей свой MyFuncs.h на h-ник и cpp-шник
Это сообщение отредактировал(а) Alca - 11.2.2010, 12:48 |
|||
|
||||
bilbobagginz |
|
||||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
WiND терминология: файл .h - хедер (заголовок) - это место, где ты объявляешь классы, методы, и функции. файл .cpp - исходник, это место, где ты реализуешь объявленное, определяешь. единственное исключение - это inline функции/методы - когда ты их определяешь в заголовке. напр. твои функции лучше всего объявить так:
а определить так:
Использовать же функции и методы inline имеет смысл лишь в редких случаях, когда это улучшает скорость выполнения программы. т.е. когда выполнение функции значительно короче, чем прыжок в обычную функцию (т.е. сохраниение регистров процессора, стека и т.д.). Когда ты указываешь, что функция - inline, каждый ее вызов при компиляции заменяется ее кодом (похоже на макро), в отличие от обычной функции, когда каждый ее вызов переносит контроль кода в другое место, где код функции находится. Думаю правило "буравчика" в решении использовать или нет inline можно так: для сохранения регистров и др. нужной информации при вызове функции нужно несколько машинных комманд, и это ессно занимает некоторое время. Если функция-кандидат - не имеет циклов, и делает какие-то очень быстрые действия, то имеет смысл ее сделать inline, т.к. сохранение данных, стека и т.д. 2 раза займет дольше времени, чем выполнить код здесь и сейчас. А если функция - цикл (напр. strstr - обязательно цикл, и for(){} - тоже), то использовать inline - не стоит с т.з. скорости и величины программы. но я - не гуру по C++, просьба гуру C++: если я не прав прошу меня ... поправить! Это сообщение отредактировал(а) bilbobagginz - 12.2.2010, 15:41 -------------------- Я ещё не демон. Я только учусь. |
||||
|
|||||
bsa |
|
|||
![]() Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Модератор Сообщений: 9185 Регистрация: 6.4.2006 Где: Москва, Россия Репутация: 85 Всего: 196 |
inline это рекомендация компилятору. Он может ее молча игнорировать. Что собственно и делает при отключенной оптимизации (а то невозможно отлаживать программу).
Нет ничего плохого в использовании циклов внутри inline-функций. Почти вся STL состоит из inline- функций/методов. При вызове функций регистры не сохраняются. Просто эта операция не очень быстрая. По умолчанию inline лучше использовать для функций типа геттеров и сеттеров, логика которых не предполагает сложных вычислений. Обычно, они возвращают/устанавливают значение переменной класса. Так же без inline невозможно пока что делать шаблонные методы и функции. Так как далеко не все компиляторы поддерживают extern template - нельзя использовать шаблоны там, где не доступно их определение (реализация). С другой стороны, как я уже написал выше, iniline - это только рекомендация. Компилятор, если сочтет нужным, сделает ее обычной функцией, которую будет вызывать при необходимости стандартным образом. Причем, эта функция будет единой для всех единиц трансляции (т.е. дублирования кода не будет). |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
![]() -------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
WiND |
|
||||||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
Спасибо за ответы)
Т.е без разницы, использую я inline или нет? Как лучше поступить? Так MyFuncs.h
Или так MyFuncs.h
MyFuncs.cpp
ЗЫ: Еще вопрос всплыл. Определяю макросы, где обычная конкатенация строковых литералов. с переменным числом параметров #define MSG_1(param1, param2) "MSG1 " ## param1 ## " " ## param2 #define MSG_1(param1, param2б param3) "MSG2 " ## param1 ## " " ## param2 ## " " ## param3 ... Эти макросы будут часто использоваться, соответственно будет много констант с одним и тем же текстом. Думал заменить текст в макросах на константы, но это непозволительно. Как лучше поступить? создать отдельную функцию? или создать функцию, вызывающую эти макросы, тогда кол-во их будет одинарным? Отказаться вообще от макросов? (Понимаю, дрянь эти макросы(дефайн и т.п) но почему-то меня к ним патологически тянет) Это сообщение отредактировал(а) WiND - 12.2.2010, 17:32 |
||||||
|
|||||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
То что я предложил
Добавлено через 11 секунд ![]() |
|||
|
||||
WiND |
|
|||
Новичок Профиль Группа: Участник Сообщений: 13 Регистрация: 3.12.2006 Репутация: нет Всего: нет |
2Alca, А чем будет лучше тогда?
лично я не хочу из-зв двух(мб 3х) мизерный функций создавать еще срр файл. просто когда много файлов - путает сознание) Но вместе с этим, хочется делать правильно) Несмотря на подробные ответы, они противоричивы и слегка сбили меня с толку) И так сходу я не понял разницы) вот и спрос )) |
|||
|
||||
unicuum |
|
|||
![]() Опытный ![]() ![]() Профиль Группа: Участник Сообщений: 830 Регистрация: 16.3.2005 Где: Рашка Репутация: нет Всего: 8 |
-------------------- ![]() обычный день на винграде |
|||
|
||||
Alca |
|
|||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
раздутие кода 100%-во не будет |
|||
|
||||
bilbobagginz |
|
|||
![]() Naughtius Maximus ![]() ![]() ![]() ![]() Профиль Группа: Экс. модератор Сообщений: 8813 Регистрация: 2.3.2004 Где: Israel Репутация: нет Всего: 317 |
-------------------- Я ещё не демон. Я только учусь. |
|||
|
||||
Alca |
|
||||||||
Эксперт ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3993 Регистрация: 14.6.2006 Репутация: 2 Всего: 50 |
а чем тебя функции не устроили? Добавлено @ 17:59
инлайного Добавлено @ 18:00
Если у него проект маленький, то пофиг что юзать. Добавлено @ 18:03
два вместо одного ![]() Добавлено @ 18:04 это у тебя тут 2-3 функции, а если 20-30? И всех их заинлайнить? Тогда возможно раздутие кода. Добавлено @ 18:13 Если на то пошло, тогда пихай классы в один файл. Меньше файлов - меньше путаниц. ![]() Это сообщение отредактировал(а) Alca - 12.2.2010, 18:14 |
||||||||
|
|||||||||
mes |
|
|||
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
все одинаковые строковые литералы современный компилятор самостоятельно "объединяет", т.е. в теле программы будут определены единожды. |
|||
|
||||
![]() ![]() ![]() |
Правила форума "C/C++: Для новичков" | |
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей) | |
0 Пользователей: | |
« Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |