| Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате |
| Форум программистов > C/C++: Общие вопросы > inline в h и cpp |
| Автор: null56 18.3.2009, 17:27 | ||||||||
Собственно хотел поинтересоваться, существует ли способ реализовать такую запись
Собственно, как умудряются объявлять функцию INLINE в хедере, а реализовывать в спп....? Если я пробую провернуть нечто подобное, то получаю
и это логично, даже сам стандарт говорит о том, что объявлегние и определение должно быть в хедере, но не раз наблюдал обратное.... Вот например фрагменты из Qt класса QString....
Как такое реализуется? с помощью определенных настроек компилятора? или как? Заранее благодарен за помощь |
| Автор: Lazin 18.3.2009, 17:31 |
| inline - это всего-лишь хинт компилятору, можно просто им не пользоваться, на результат это не повлияет |
| Автор: null56 18.3.2009, 17:46 |
| Не... вопрос в том, как это реализуется, просто так, как я написал не выходит |
| Автор: zim22 18.3.2009, 17:49 |
| Из книги: Определенные внутри класса функции-члены, такие, например, как не получающие никаких аргументов, автоматически считаются встраиваевыми. Т.е. при создании исполняемого кода компилятор попытается встроить ее содержимое по месту вызова. Функцию-член можно также объявлять встраиваемой явно. Функцию-член можно объявить встраиваемой в составе ее объявления внутри тела класса. В качестве альтернативы, функцию можно объявить встраиваемой при ее определении вне тела класса. Т.е. ключевое слово inline применимо как в объявлении, так и в определении. Преимуществом определения встраиваемых функций вне класса является повышение удобочитаемости кода класса. На заметку: Подобно другим встраиваевым функциям, определение встраиваемой функции-члена должно присутствовать в каждом использующем ее файле исходного кода. Определение встраиваемой функции-члена, располагаемое вне теле класса, как правило, имеет смысл помещать в тот же файл заголовка, в котором определён класс. |
| Автор: Earnest 18.3.2009, 17:55 |
Если эти члены публичные, то они должны быть определены во включаемом коде, иначе будут проблемы на линковке. Если их нет в хедере, возможно они вынесены в какой-то отдельный файл, но все равно включены инклудом, скажем, в конце хедера. Например, так делается в MFC - куча функций реализованы в файлах inl. Но никто не мешает назвать файл cpp - препроцессору это все равно. |
| Автор: vinter 18.3.2009, 19:03 |
| null56, покажи как ты делал, и как тебе сказал компилятор. Так же скажи какой компилятор. |
| Автор: null56 18.3.2009, 19:47 | ||||||||
vinter, ну я написал, как пытался сделать, пытался засунуть объявление в хедер
а определение в cpp
Ну написал линковщик вполне предсказуемо что...
Earnest правильно скзаал, я об этом не подумал, видимо Qt где - то цепляет их в хедер, просто это явно не видно, а так правила он не нарушает, вот все и собирается.... я об этом не подумал, а правила нарушать нельзя... по этому поводу хорошая статья http://habrahabr.ru/blogs/cpp/50775/ да и стандарт об этом говорит.... ЗЫ:
Добавлено через 3 минуты и 25 секунд zim22, все правильно всем спасибо |
| Автор: null56 18.3.2009, 20:02 | ||
Earnest, так и есть.... все даже явно видно.... в том же файле
|
| Автор: vinter 18.3.2009, 20:32 |
что же ты статью прочитал, а выводов не сделал? Там есть отличный 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 | ||
Не в выводах дело, а в моей невнимательности, просто не заметил реализацию в хедере |