|
inline методы классов |
|
|
|
May 28 2009, 12:15
|
Профессионал
    
Группа: Участник
Сообщений: 1 040
Регистрация: 3-01-07
Пользователь №: 24 061

|
Здравствуйте! WinAVR. Пишем класс. Большинство его методов очень простые и маленькие. Хотим сделать эти методы inline. Причём класс ДОЛЖЕН БЫТЬ описан в .h файле, а реализация методов ДОЛЖНА БЫТЬ ВЫПОЛНЕНА в .cpp файле. Не спрашивайте почему  Т. е., трудность - разделение описания класса и определения его inline методов на два файла. Код ниже - правильная реализация inline методов класса? Может быть они должны быть реализованы или строго в теле класса (по-умолчанию уже inline) или вне класса, но с указанием спецификатора доступа и обязательно в .h файле? qwe.h Код class qwe { public: inline void f(void); }; qwe.cpp Код void qwe::f(void) { // что-то }; Благодарю заранее!
--------------------
Благодарю заранее!
|
|
|
|
|
May 28 2009, 22:17
|

читатель даташитов
   
Группа: Свой
Сообщений: 853
Регистрация: 5-11-06
Из: Днепропетровск
Пользователь №: 21 999

|
В принципе, простой класс вообще может быть целиком описан в .h файле. Впрочем, практика на любителя. Еще имейте в виду - компилятор обычно инлайнит только очень короткие функции, вроде такой: Код inline unsigned int getUsedCount( void ) { return qty; } Функции подлиннее делает вызываемыми, причем уже в конкретном объекте компиляции, если объектов несколько, функция будет в каждом... Тут, конечно, много зависит от компилятора и его настроек. Возможно, придется пользоваться директивами вроде Код #pragma inline=forced
|
|
|
|
|
May 29 2009, 11:09
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(HARMHARM @ May 29 2009, 06:54)  Не совсем понятно, почему линкер не ругается на одинаковые символы в этом случае? Потому что их имена экспортируются не директивой PUBLIC, а директивой PUBWEAK (можно почитать в описани на ассемблер), которая как раз для таких случаев и придумана. Ну или компилятор генерит аналогичные признаки в объектном коде. Еще одно применение этой директивы, которым вы наверняка пользуетесь - putchar(). Библиотечный экспортируется с PUBWEAK (это видно, если посмотреть список символов библиотеки при помощи xlib), а ваш - с PUBLIC.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
|
May 29 2009, 11:10
|

Местный
  
Группа: Участник
Сообщений: 340
Регистрация: 25-10-05
Из: Пермь, Россия
Пользователь №: 10 091

|
Цитата(n_bogoyavlensky @ May 28 2009, 17:15)  Причём класс ДОЛЖЕН БЫТЬ описан в .h файле, а реализация методов ДОЛЖНА БЫТЬ ВЫПОЛНЕНА в .cpp файле. Что подразумевается под словом "описан"? Forward declaration под это понятие подпадает? Если да, то в .h файле можно написать "class qwe;", а в .cpp файле - его полное определение: Код class qwe { public: void f(void) { /* что-то */ } };
--------------------
Всего наилучшего, Alex Mogilnikov
|
|
|
|
|
May 29 2009, 16:58
|

Гуру
     
Группа: Модераторы
Сообщений: 8 455
Регистрация: 15-05-06
Из: Рига, Латвия
Пользователь №: 17 095

|
Цитата(sergeeff @ May 29 2009, 18:17)  3. Если функция в .h декларирована как inline, а описана в .cpp (даже если и inline) она везде будет вызываться как обычная функция. как интересно. Код file.h class a_t { public: inline void test(); } #ifdef IN_HEADER void a_t::test() { } #endif
file.cpp:
#include "file.h" #ifndef IN_HEADER void a_t::test() { } #endif a_t a; void Test() { a.test(); } компилятор для file.cpp не заметит отличий.
--------------------
На любой вопрос даю любой ответ"Write code that is guaranteed to work, not code that doesn’t seem to break" ( C++ FAQ)
|
|
|
|
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0
|
|
|