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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> inline в h и cpp, как люди пишут 
V
    Опции темы
null56
Дата 18.3.2009, 17:27 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Собственно хотел поинтересоваться, существует ли способ реализовать такую запись
Код

// хедер
class MyClass
{
      inline void Go();
};


Код

// спп
/** с чего здесь начинается не уверен, но */ void Go()
{
 return;
}

Собственно, как умудряются объявлять функцию INLINE в хедере, а реализовывать в спп....?
Если я пробую провернуть нечто подобное, то получаю
Код

undefined reference to 

и это логично, даже сам стандарт говорит о том, что объявлегние и определение должно быть в хедере, но не раз наблюдал обратное....
Вот например фрагменты из Qt класса QString....
Код

   inline const QChar *unicode() const;
    inline QChar *data();
    inline const QChar *data() const;
    inline const QChar *constData() const;

    inline void detach();
    inline bool isDetached() const;

Как такое реализуется? с помощью определенных настроек компилятора? или как?
Заранее благодарен за помощь
PM MAIL   Вверх
Lazin
Дата 18.3.2009, 17:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

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



inline - это всего-лишь хинт компилятору, можно просто им не пользоваться, на результат это не повлияет smile 
PM MAIL Skype GTalk   Вверх
null56
Дата 18.3.2009, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Не... вопрос в том, как это реализуется, просто так, как я написал не выходит
PM MAIL   Вверх
zim22
Дата 18.3.2009, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


depict1
****


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

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



Из книги:

Определенные внутри класса функции-члены, такие, например, как не получающие никаких аргументов, автоматически считаются встраиваевыми. Т.е. при создании исполняемого кода компилятор попытается встроить ее содержимое по месту вызова. Функцию-член можно также объявлять встраиваемой явно.
Функцию-член можно объявить встраиваемой в составе ее объявления внутри тела класса. В качестве альтернативы, функцию можно объявить встраиваемой при ее определении вне тела класса. Т.е. ключевое слово inline применимо как в объявлении, так и в определении. Преимуществом определения встраиваемых функций вне класса является повышение удобочитаемости кода класса.

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


--------------------
PM MAIL   Вверх
Earnest
Дата 18.3.2009, 17:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Экс. модератор
Сообщений: 5962
Регистрация: 17.6.2005
Где: Рязань

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



Цитата(null56 @  18.3.2009,  18:27 Найти цитируемый пост)
Вот например фрагменты из Qt класса QString....

Если эти члены публичные, то они должны быть определены во включаемом коде, иначе будут проблемы на линковке. Если их нет в хедере, возможно они вынесены в какой-то отдельный файл, но все равно включены инклудом, скажем, в конце хедера. Например, так делается в MFC - куча функций реализованы в файлах inl. Но никто не мешает назвать файл cpp - препроцессору это все равно.



--------------------
...
PM   Вверх
vinter
Дата 18.3.2009, 19:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



null56, покажи как ты делал, и как тебе сказал компилятор. Так же скажи какой компилятор.


--------------------
Мой блог
PM MAIL WWW   Вверх
null56
Дата 18.3.2009, 19:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



vinter, ну я написал, как пытался сделать, пытался засунуть объявление в хедер
Код

class InlineTest
{
public:
    inline myFunc();
};

а определение в cpp
Код

InlineTest :: myFunc()
{
}

Ну написал линковщик вполне предсказуемо что...
Код

inline/main.cpp:8: undefined reference to `InlineTest::myFunc()'

Earnest правильно скзаал, я об этом не подумал, видимо Qt где - то цепляет их в хедер, просто это явно не видно, а так правила он не нарушает, вот все и собирается.... я об этом не подумал, а правила нарушать нельзя... по этому поводу хорошая статья 
http://habrahabr.ru/blogs/cpp/50775/
да и стандарт об этом говорит....

ЗЫ:
Код

gcc --version
gcc (GCC) 4.1.2 20070214 (  (gdc 0.24, using dmd 1.020)) (Gentoo 4.1.2 p1.3)


Добавлено через 3 минуты и 25 секунд
zim22, все правильно


всем спасибо
PM MAIL   Вверх
null56
Дата 18.3.2009, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Earnest, так и есть.... все даже явно видно.... в том же файле
Код

inline const QChar *QString::unicode() const
{ return reinterpret_cast<const QChar*>(d->data); }
inline const QChar *QString::data() const
{ return reinterpret_cast<const QChar*>(d->data); }
......................

PM MAIL   Вверх
vinter
Дата 18.3.2009, 20:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Explorer
****


Профиль
Группа: Завсегдатай
Сообщений: 2735
Регистрация: 1.4.2006
Где: Н.Новгород

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



Цитата(null56 @  18.3.2009,  20:47 Найти цитируемый пост)
по этому поводу хорошая статья 

что же ты статью прочитал, а выводов не сделал? Там есть отличный workaround как разделить на интерфейс\реализацию. Просто его надо немного доработать, например создав фейковый класс.


--------------------
Мой блог
PM MAIL WWW   Вверх
kokorins
Дата 18.3.2009, 21:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



http://google-styleguide.googlecode.com/sv...nline_Functions

Тут написано как это реализовывать, чтобы всё было красиво и однообразно.
PM MAIL   Вверх
null56
Дата 19.3.2009, 12:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


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

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



Цитата(vinter @ 18.3.2009,  20:32)
что же ты статью прочитал, а выводов не сделал? 

Не в выводах дело, а в моей невнимательности, просто не заметил реализацию в хедере
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

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

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

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

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


 




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


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

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