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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Странный warning на "inline" оператор. 
V
    Опции темы
mes
Дата 23.8.2009, 12:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  23.8.2009,  09:02 Найти цитируемый пост)
  Ну ты же сам сказал, что линкер умеет вставлять код инлайна, значит задача для него разрешимая и корректная. Варнинг выдается при некорректной ситуации, это признак плохого кода. Если же здесь все нормально откуда варнинг? 

Откуда компилятору знать что придет после него линкер ?  да еще нужно предугадать что сможет линкер  доделать ?! 
Не лучше же вместо проявления телепатических способностей, просто признаться, что работа не может быть до конца выполнена из за каких то ограничений.


Цитата(mes @  22.8.2009,  23:41 Найти цитируемый пост)

Что будет происходить после (например при линковке) компилятору не интересно - он должен сделать свое дело,
но ограничен в действиях, так как не имеет тела функции для своих целей - поэтому по честному предупредил smile




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


Кодофей
****


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

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



Цитата(Alexeis @  23.8.2009,  12:36 Найти цитируемый пост)
По идее раз линкер умеет вставлять инлайны, то такого рода сообщения уже должен выдавать линкер. Отсюда напрашивается вывод что все таки линкер не умеет вставлять инлайны. 

Сообщение выдается на стадии генерации объектного кода. А линкер тело функции вставляет, не понятно как, но вставляет. Иначе был бы "unresolved external"

Добавлено через 59 секунд
Цитата(Alexeis @  23.8.2009,  12:36 Найти цитируемый пост)
я лично не встречал ситуации чтобы компилятор давал варнинг если не делает функцию инлайном, обычно просто молчит.

Цитата(andrew_121 @  23.8.2009,  11:59 Найти цитируемый пост)
Честно признаюсь, такого варнинга я не встречал. 


Добавлено через 2 минуты и 6 секунд
Возможно ТС соизволит показать нам тело функции.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
mes
Дата 23.8.2009, 16:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(andrew_121 @  23.8.2009,  12:17 Найти цитируемый пост)
Возможно ТС соизволит показать нам тело функции. 

могу показать за него тело функции, точнее ее отсутствие в единице трансляции, приводящее к обсуждаемому результату.

Код

// main.cpp
inline void f();
int main() { f(); }

// any.cpp
void f() {}



Это сообщение отредактировал(а) mes - 23.8.2009, 20:04


--------------------
PM MAIL WWW   Вверх
mekhanikus
Дата 24.8.2009, 14:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



Цитата(andrew_121 @  23.8.2009,  13:17 Найти цитируемый пост)
Возможно ТС соизволит показать нам тело функции.

Не покажу я Вам тело.  smile 

Но суть попытаюсь обьяснить.

Есть класс MONTH для которого переопределены операторы сравнения (<, >, !=, ==),
соответсвующие функции обьявлены online.
Обьект класса MONTH является членом другого класса, например, DATE.
Значение MONTH можно извлечь из DATE функцией GetMonth() (не инлайн).
Делаем примерно так:

Код

bool Compare(DATE* d1, DATE* d2)
{
return (d1->GetMonth() > d2->GetMonth());
}

Получаем warning.
Пробовал обьявить GetMonth() inline - варнинг остался.
PM MAIL   Вверх
mes
Дата 24.8.2009, 14:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mekhanikus @  24.8.2009,  13:02 Найти цитируемый пост)
Есть класс MONTH для которого переопределены операторы сравнения (<, >, !=, ==),
соответсвующие функции обьявлены online.

эти инлайн операторы объявлены в хидере, а определены в cpp ?



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


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



Цитата(mes @  24.8.2009,  14:07 Найти цитируемый пост)
эти инлайн операторы объявлены в хидере, а определены в cpp ?

 Угадал  smile 
Пробовал перенести определения в хидер - монопенисуально.

Это сообщение отредактировал(а) mekhanikus - 24.8.2009, 14:18
PM MAIL   Вверх
mes
Дата 24.8.2009, 15:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mekhanikus @  24.8.2009,  13:17 Найти цитируемый пост)
- монопенисуально.

smile, позвольте узнать как это переводится на человеческий ?!

Добавлено через 1 минуту и 8 секунд
P.S. хотя я вроде догадался, что оно значит smile

Добавлено через 2 минуты и 35 секунд
Цитата(mekhanikus @  24.8.2009,  13:17 Найти цитируемый пост)
Пробовал перенести определения в хидер

Значит не все перенесли, и у какой то инлайн функции тело остается определенным в другой единице трансляции.


--------------------
PM MAIL WWW   Вверх
mekhanikus
Дата 25.8.2009, 13:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



Пока просто удалил префикс inline, чтоб варнинги глаза не мозолили.
Потом, как-нибудь поэкспериментирую с разными вариантами объявления-определения.

Тему не закрываю, может кто идею подкинет или обьяснит.
PM MAIL   Вверх
mes
Дата 25.8.2009, 13:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mekhanikus @  25.8.2009,  12:31 Найти цитируемый пост)
Тему не закрываю, может кто идею подкинет или обьяснит. 

Вообще то объяснение уже звучало выше, но раз его не заметили приведу еще раз и подробней.
Цитата(Standart 7.1.2)

4 An inline function shall be defined in every translationunit in which
  it is used
 and shall have exactly the same definition  in  every  case
  (_basic.def.odr_).   [Note:  a  call  to  the  inline  function may be
  encountered before its definition appears in the translation unit.   ]

  2) The inline keyword has no effect on the linkage of a function.
  If a function with external linkage is declared inline in one transla-
  tion unit, it shall be declared inline in  all  translation  units  in
  which  it  appears;  no diagnostic is required.  [Note: a static local
  variable in an extern  inline  function  always  refers  to  the  same
  object.  ]


Вы где то нарушили правило выделенное жирным, т.е. в единице трансляции присутствовало только декларация, и не было определения.

пример такой ситуации приведен в этом посте :
http://forum.vingrad.ru/index.php?showtopi...t&p=1948732


Также нарушили пункт 2), объявив в одном месте функцию инлайн, а в другом определив ее как обычную функцию
(как показано в предыдущем примере), что позволило слинковать программу без ошибок. 
Но это уже напрямую к теме не относится.

Это сообщение отредактировал(а) mes - 25.8.2009, 13:47


--------------------
PM MAIL WWW   Вверх
Alexeis
Дата 25.8.2009, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


Профиль
Группа: Админ
Сообщений: 11743
Регистрация: 12.10.2005
Где: Зеленоград

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



Цитата(mes @  25.8.2009,  12:42 Найти цитируемый пост)
Также нарушили пункт 2), объявив в одном месте функцию инлайн, а в другом определив ее как обычную функцию

  Хм.. про это вроде не было речи. Если хидере оно объявлено как инлайн, то все модули поймут его как инлайн. Разве нет?


--------------------
Vit вечная память.

Обсуждение действий администрации форума производятся только в этом форуме

гениальность идеи состоит в том, что ее невозможно придумать
PM ICQ Skype   Вверх
mekhanikus
Дата 25.8.2009, 14:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



Цитата(mes @  25.8.2009,  13:42 Найти цитируемый пост)
объявив в одном месте функцию инлайн, а в другом определив ее как обычную функцию

Туплю по-черному  smile 

Код

class MONTH
{
\...\
inline bool operator> (const MONTH&)const; // определен в .срр
\...\
}

class DATE
{
\...\
MONTH GetMonth()const{return Month;}; // определен в .h
\...\
}

class CALENDAR
{
\...\
MONTH GetMonth()const{return Month;}; // определен в .h
\...\
}

Если делаем так:
Код

DATE d1,d2;
CALENDAR cal;
\...\
bool b = d1.GetMonth() > d2.GetMonth(); //нет варнинга!!!
b = d1.GetMonth() > cal.GetMonth(); // варнинг !!!


Что компилятору не нравится во втором случае?
PM MAIL   Вверх
mes
Дата 25.8.2009, 14:50 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(Alexeis @  25.8.2009,  13:13 Найти цитируемый пост)
  Хм.. про это вроде не было речи. Если хидере оно объявлено как инлайн, то все модули поймут его как инлайн. Разве нет? 

если предыдущий пример 
Код

// main.cpp
inline void f();
int main() { f(); }
// any.cpp
void f() {} 

изменить на
Код

// main.cpp
inline void f();
int main() { f(); }
// any.cpp
inline void f() {} // добавлено inline

то линковка происходить не должна.




Это сообщение отредактировал(а) mes - 25.8.2009, 14:50


--------------------
PM MAIL WWW   Вверх
mes
Дата 25.8.2009, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mekhanikus @  25.8.2009,  13:30 Найти цитируемый пост)
Что компилятору не нравится во втором случае? 

позвольте узнать, какой у Вас компилятор ? 





--------------------
PM MAIL WWW   Вверх
mekhanikus
Дата 26.8.2009, 13:40 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Вольноопределяющийся
*


Профиль
Группа: Участник
Сообщений: 186
Регистрация: 16.6.2008
Где: Спасск-Дальний

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



GNU GCC Compiler.

PM MAIL   Вверх
mes
Дата 26.8.2009, 15:41 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


любитель
****


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

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



Цитата(mekhanikus @  26.8.2009,  12:40 Найти цитируемый пост)
GNU GCC Compiler.

gcc 3.4.2, как и VS2008 не слинковывает то, что Вы описали в предыдущем посту.
вот упрощенный пример:
Код

//  a.h
struct A
{
  inline bool operator < (const A&);
};

// a.cpp
#include "a.h"
bool A::operator <(const A&)  { return true; }

//main.cpp
#include "a.h"
int main () { 
A a; a<a; 
}

а Ваш компилятор как реагирует  на этот код ?


Это сообщение отредактировал(а) mes - 26.8.2009, 15:41


--------------------
PM MAIL WWW   Вверх
Страницы: (3) Все 1 [2] 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь


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

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


 




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


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

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