Модераторы: 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   Вверх
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   Вверх
mekhanikus
Дата 27.8.2009, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


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


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

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



Код

warning: inline function `bool A::operator<(const A&)' used but never defined
undefined reference to `A::operator<(A const&)'


Варнинг такой же как и в моем случае.

А вот с "undefined reference" я боролся просто удаляя файл из проекта, а затем снова его добавляя, и все работает.
Но в этом случае не прокатывает. 

ХА! При удалении инлайна все компилится.

Значит, проблемы у компитлятора?

Но одно дело - не слинковать и выдать ошибку, а другое - что-то всетаки скомпилить и выдать предупреждение.

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


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


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

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



Цитата(mekhanikus @  27.8.2009,  13:06 Найти цитируемый пост)
Варнинг такой же как и в моем случае.

ну а другого не могло быть

Цитата(mekhanikus @  27.8.2009,  13:06 Найти цитируемый пост)
А вот с "undefined reference" я боролся просто удаляя файл из проекта, а затем снова его добавляя, и все работает.
Но в этом случае не прокатывает. 

вот об этом и спрашивалось.. то есть Вы получали линковку неким трюком.. теперь все стало на места..

Цитата(mekhanikus @  27.8.2009,  13:06 Найти цитируемый пост)
ХА! При удалении инлайна все компилится.

ну так об этом и просил компилятор.. либо определить все в одном месте (тело возле декларации),  либо убрать inline.

Цитата(mekhanikus @  27.8.2009,  13:06 Найти цитируемый пост)
Значит, проблемы у компитлятора?

Нет, компилятор  (если не учитывать то, что он как то проглатывал Ваш трюк с удалением файла) ведет себя правильно.

Цитата(mekhanikus @  27.8.2009,  13:06 Найти цитируемый пост)
Но одно дело - не слинковать и выдать ошибку, а другое - что-то всетаки скомпилить и выдать предупреждение.

А вот тут не буду больше повторяться, перечитайте вдумчиво, что Вам говорилось в предыдущих постах..
 smile 



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


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


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

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



Всем спасибо!

P.S. Короче, учите матчасть, коллега! smile (это я к себе обращаюсь)
PM MAIL   Вверх
Страницы: (3) [Все] 1 2 3 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "C/C++: Для новичков"
JackYF
bsa

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

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

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

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


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

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


 




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


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

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