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

Поиск:

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


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


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

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



Код

warning: inline function `bool MONTH::operator>(const MONTH&) const' used but never defined


Получаю вот такое предупреждение компилятора.
При этом все работает так, как надо.
Если из определения оператора убрать префикс "inline", предупреждения нет.

Что это значит?
PM MAIL   Вверх
Alexeis
Дата 22.8.2009, 14:39 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



  Компилятор? Код ошибки?


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

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

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


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


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

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



GNU GCC Compiler.

Это - не ошибка, а warning.
Никакого кода нет.
PM MAIL   Вверх
Alexeis
Дата 22.8.2009, 14:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



  Аа, так по ходу инлайн объявлен реализован не в хидере, поэтому он игнорирует директиву inline, собственно на это и ругается что не знает знает где код функции взять для подстановки. Советую перенести реализацию в заголовок.


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

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

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


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


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

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



Цитата(Alexeis @  22.8.2009,  14:52 Найти цитируемый пост)
Советую перенести реализацию в заголовок.

Насколько я знаю, если функция реализована в заголовке, она автоматически становится inline.
Префикс же "inline" делает встраиваимой любую функцию.

Цитата(Alexeis @  22.8.2009,  14:52 Найти цитируемый пост)
не знает знает где код функции взять для подстановки

Если б не знала, не компилила бы, был бы error, а так только предупреждает.
PM MAIL   Вверх
andrew_121
Дата 22.8.2009, 15:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


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

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



Цитата(mekhanikus @  22.8.2009,  15:39 Найти цитируемый пост)
Если б не знала, не компилила бы, был бы error, а так только предупреждает. 

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


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


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


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

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



Цитата(andrew_121 @  22.8.2009,  15:54 Найти цитируемый пост)
не видит тела функции чтоб встроить его

Тогда что же он встраивает?
Код то работает правильно.
Цитата(andrew_121 @  22.8.2009,  15:54 Найти цитируемый пост)
По сему, подозреваю что эта функция не будет инлайн. 

Да, пофиг, пусть будет не инлайн.
PM MAIL   Вверх
Alexeis
Дата 22.8.2009, 19:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Амеба
Group Icon


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

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



Цитата(mekhanikus @  22.8.2009,  14:39 Найти цитируемый пост)
Префикс же "inline" делает встраиваимой любую функцию.

  Не уверен, я себе так представляю процесс компиляции. Каждый модуль компилируется отдельно, предварительно в него включаются текст всех инклудов (если нет прекомпилированных хидеров). Получается что реально код функции откомпилируется в тот объектник где она реализована. Далее компилируется другой модуль, компилятор видит опцию инлайн и ищет реализацию функции выше по инклудам, разумеется там он ее не находит, и ему ничего не остается как оставить в объектнике символьное имя функции. Дальше в работу включается линкер. Линкер найдет упоминание функции и вместо символов вставит ее адрес. 
  Возможно текущие навороченные линкеры и умеют вставлять код, но тогда ведь пойдут лесом все статические адреса и метки перехода, которые вставил компилятор, ведь компилятор когда делал объектник он еще не знал сколько места займет нужная ему функция, поэтому он и должен был зарезервировать 4 байта и остальные адреса расчитывать так как-будто в коде инструкция call + <адрес вызова>
 


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

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

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


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


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

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



Цитата(Alexeis @  22.8.2009,  18:45 Найти цитируемый пост)
 Возможно текущие навороченные линкеры и умеют вставлять код,

 smile 
Цитата(Alexeis @  22.8.2009,  18:45 Найти цитируемый пост)
но тогда ведь пойдут лесом все статические адреса и метки перехода, 

 smile 
Цитата(Alexeis @  22.8.2009,  18:45 Найти цитируемый пост)
ведь компилятор когда делал объектник он еще не знал сколько места займет нужная ему функция, поэтому он и должен был зарезервировать 4 байта и остальные адреса расчитывать так как-будто в коде инструкция call + <адрес вызова>

поэтому он все функции вызывает не по реальному адресу , а по их  символьному имени. Дальше 
Цитата(Alexeis @  22.8.2009,  18:45 Найти цитируемый пост)
в работу включается линкер. Линкер найдет упоминание функции и вместо символов вставит ее адрес. 

Т.е реальные адреса появляются только в бинарнике посредством разрешения линкером  символических связей между (и внутри) объектников.

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


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


Амеба
Group Icon


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

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



Цитата(mes @  22.8.2009,  19:09 Найти цитируемый пост)
поэтому он все функции вызывает не по реальному адресу , а по их  символьному имени. Дальше 

  Символы как символы, а метки перехода? Тоже остаются символьными? 

  В чем же тогда суть варнинга? 


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

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

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


Кодофей
****


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

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



Цитата(Alexeis @  22.8.2009,  21:12 Найти цитируемый пост)
В чем же тогда суть варнинга?  

На стадии связывания, линкер подставит адрес.


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


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


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

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



Цитата(Alexeis @  22.8.2009,  20:12 Найти цитируемый пост)
В чем же тогда суть варнинга?  


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



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


Амеба
Group Icon


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

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



Цитата(mes @  22.8.2009,  23:41 Найти цитируемый пост)
но ограничен в действиях, так как не имеет тела функции для своих целей - поэтому по честному предупредил smile

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


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

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

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


Кодофей
****


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

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



Цитата(Alexeis @  23.8.2009,  10:02 Найти цитируемый пост)
Если же здесь все нормально откуда варнинг? 

Есть ограничение на тело инлайн функций. Когда-то нельзя было в них использовать if(), switch(), for() и еще что-то. Мы же не видим код функции. Честно признаюсь, такого варнинга я не встречал.


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


Амеба
Group Icon


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

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



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


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

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

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

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

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

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

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


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

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


 




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


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

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