Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > inline в h и cpp


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

// хедер
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;

Как такое реализуется? с помощью определенных настроек компилятора? или как?
Заранее благодарен за помощь

Автор: Lazin 18.3.2009, 17:31
inline - это всего-лишь хинт компилятору, можно просто им не пользоваться, на результат это не повлияет smile 

Автор: null56 18.3.2009, 17:46
Не... вопрос в том, как это реализуется, просто так, как я написал не выходит

Автор: zim22 18.3.2009, 17:49
Из книги:

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

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

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

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

Автор: vinter 18.3.2009, 19:03
null56, покажи как ты делал, и как тебе сказал компилятор. Так же скажи какой компилятор.

Автор: null56 18.3.2009, 19:47
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, все правильно


всем спасибо

Автор: null56 18.3.2009, 20:02
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); }
......................

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

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

Автор: kokorins 18.3.2009, 21:06
http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml?showone=Inline_Functions#Inline_Functions

Тут написано как это реализовывать, чтобы всё было красиво и однообразно.

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

Не в выводах дело, а в моей невнимательности, просто не заметил реализацию в хедере

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)