![]() |
|
Модераторы: bsa |
![]()
|
|
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Получаю вот такое предупреждение компилятора. При этом все работает так, как надо. Если из определения оператора убрать префикс "inline", предупреждения нет. Что это значит? |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Компилятор? Код ошибки?
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
GNU GCC Compiler.
Это - не ошибка, а warning. Никакого кода нет. |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Аа, так по ходу инлайн объявлен реализован не в хидере, поэтому он игнорирует директиву inline, собственно на это и ругается что не знает знает где код функции взять для подстановки. Советую перенести реализацию в заголовок.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Насколько я знаю, если функция реализована в заголовке, она автоматически становится inline. Префикс же "inline" делает встраиваимой любую функцию. Если б не знала, не компилила бы, был бы error, а так только предупреждает. |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Это предупреждение выдается на стадии генерации объектного кода. По этому, компилятор(т.е. не линкер) не видит тела функции чтоб встроить его. По сему, подозреваю что эта функция не будет инлайн. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
||||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Не уверен, я себе так представляю процесс компиляции. Каждый модуль компилируется отдельно, предварительно в него включаются текст всех инклудов (если нет прекомпилированных хидеров). Получается что реально код функции откомпилируется в тот объектник где она реализована. Далее компилируется другой модуль, компилятор видит опцию инлайн и ищет реализацию функции выше по инклудам, разумеется там он ее не находит, и ему ничего не остается как оставить в объектнике символьное имя функции. Дальше в работу включается линкер. Линкер найдет упоминание функции и вместо символов вставит ее адрес. Возможно текущие навороченные линкеры и умеют вставлять код, но тогда ведь пойдут лесом все статические адреса и метки перехода, которые вставил компилятор, ведь компилятор когда делал объектник он еще не знал сколько места займет нужная ему функция, поэтому он и должен был зарезервировать 4 байта и остальные адреса расчитывать так как-будто в коде инструкция call + <адрес вызова> -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
поэтому он все функции вызывает не по реальному адресу , а по их символьному имени. Дальше
Т.е реальные адреса появляются только в бинарнике посредством разрешения линкером символических связей между (и внутри) объектников. Это сообщение отредактировал(а) mes - 22.8.2009, 20:11 |
||||
|
|||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Символы как символы, а метки перехода? Тоже остаются символьными? В чем же тогда суть варнинга? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
На стадии связывания, линкер подставит адрес. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Что будет происходить после (например при линковке) компилятору не интересно - он должен сделать свое дело, но ограничен в действиях, так как не имеет тела функции для своих целей - поэтому по честному предупредил |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Ну ты же сам сказал, что линкер умеет вставлять код инлайна, значит задача для него разрешимая и корректная. Варнинг выдается при некорректной ситуации, это признак плохого кода. Если же здесь все нормально откуда варнинг? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Есть ограничение на тело инлайн функций. Когда-то нельзя было в них использовать if(), switch(), for() и еще что-то. Мы же не видим код функции. Честно признаюсь, такого варнинга я не встречал. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
andrew_121, я лично не встречал ситуации чтобы компилятор давал варнинг если не делает функцию инлайном, обычно просто молчит. А тут ситуация как-бы он может сделать, но не может найти тело функции. По идее раз линкер умеет вставлять инлайны, то такого рода сообщения уже должен выдавать линкер. Отсюда напрашивается вывод что все таки линкер не умеет вставлять инлайны.
-------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Откуда компилятору знать что придет после него линкер ? да еще нужно предугадать что сможет линкер доделать ?! Не лучше же вместо проявления телепатических способностей, просто признаться, что работа не может быть до конца выполнена из за каких то ограничений. |
|||
|
||||
| andrew_121 |
|
|||
![]() Кодофей ![]() ![]() ![]() ![]() Профиль Группа: Завсегдатай Сообщений: 3448 Регистрация: 3.1.2008 Репутация: 10 Всего: 33 |
Сообщение выдается на стадии генерации объектного кода. А линкер тело функции вставляет, не понятно как, но вставляет. Иначе был бы "unresolved external" Добавлено через 59 секунд
Добавлено через 2 минуты и 6 секунд Возможно ТС соизволит показать нам тело функции. -------------------- Удалил аккаунт. Прощайте! |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
могу показать за него тело функции, точнее ее отсутствие в единице трансляции, приводящее к обсуждаемому результату.
Это сообщение отредактировал(а) mes - 23.8.2009, 20:04 |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Не покажу я Вам тело. Но суть попытаюсь обьяснить. Есть класс MONTH для которого переопределены операторы сравнения (<, >, !=, ==), соответсвующие функции обьявлены online. Обьект класса MONTH является членом другого класса, например, DATE. Значение MONTH можно извлечь из DATE функцией GetMonth() (не инлайн). Делаем примерно так:
Получаем warning. Пробовал обьявить GetMonth() inline - варнинг остался. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
||||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
||||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Добавлено через 1 минуту и 8 секунд P.S. хотя я вроде догадался, что оно значит Добавлено через 2 минуты и 35 секунд Значит не все перенесли, и у какой то инлайн функции тело остается определенным в другой единице трансляции. |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Пока просто удалил префикс inline, чтоб варнинги глаза не мозолили.
Потом, как-нибудь поэкспериментирую с разными вариантами объявления-определения. Тему не закрываю, может кто идею подкинет или обьяснит. |
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
Вообще то объяснение уже звучало выше, но раз его не заметили приведу еще раз и подробней.
Вы где то нарушили правило выделенное жирным, т.е. в единице трансляции присутствовало только декларация, и не было определения. пример такой ситуации приведен в этом посте : http://forum.vingrad.ru/index.php?showtopi...t&p=1948732 Также нарушили пункт 2), объявив в одном месте функцию инлайн, а в другом определив ее как обычную функцию (как показано в предыдущем примере), что позволило слинковать программу без ошибок. Но это уже напрямую к теме не относится. Это сообщение отредактировал(а) mes - 25.8.2009, 13:47 |
|||
|
||||
| Alexeis |
|
|||
![]() Амеба Профиль Группа: Админ Сообщений: 11743 Регистрация: 12.10.2005 Где: Зеленоград Репутация: 4 Всего: 459 |
Хм.. про это вроде не было речи. Если хидере оно объявлено как инлайн, то все модули поймут его как инлайн. Разве нет? -------------------- Vit вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
| mekhanikus |
|
||||||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Туплю по-черному
Если делаем так:
Что компилятору не нравится во втором случае? |
||||||
|
|||||||
| mes |
|
||||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
если предыдущий пример
изменить на
то линковка происходить не должна. Это сообщение отредактировал(а) mes - 25.8.2009, 14:50 |
||||||
|
|||||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
позвольте узнать, какой у Вас компилятор ? |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
GNU GCC Compiler.
|
|||
|
||||
| mes |
|
|||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
gcc 3.4.2, как и VS2008 не слинковывает то, что Вы описали в предыдущем посту. вот упрощенный пример:
а Ваш компилятор как реагирует на этот код ? Это сообщение отредактировал(а) mes - 26.8.2009, 15:41 |
|||
|
||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Варнинг такой же как и в моем случае. А вот с "undefined reference" я боролся просто удаляя файл из проекта, а затем снова его добавляя, и все работает. Но в этом случае не прокатывает. ХА! При удалении инлайна все компилится. Значит, проблемы у компитлятора? Но одно дело - не слинковать и выдать ошибку, а другое - что-то всетаки скомпилить и выдать предупреждение. Это сообщение отредактировал(а) mekhanikus - 27.8.2009, 14:27 |
|||
|
||||
| mes |
|
||||
|
любитель ![]() ![]() ![]() ![]() Профиль Группа: Участник Клуба Сообщений: 7954 Регистрация: 14.1.2006 Репутация: 79 Всего: 250 |
ну а другого не могло быть
вот об этом и спрашивалось.. то есть Вы получали линковку неким трюком.. теперь все стало на места.. ну так об этом и просил компилятор.. либо определить все в одном месте (тело возле декларации), либо убрать inline. Нет, компилятор (если не учитывать то, что он как то проглатывал Ваш трюк с удалением файла) ведет себя правильно.
А вот тут не буду больше повторяться, перечитайте вдумчиво, что Вам говорилось в предыдущих постах.. |
||||
|
|||||
| mekhanikus |
|
|||
|
Вольноопределяющийся ![]() Профиль Группа: Участник Сообщений: 186 Регистрация: 16.6.2008 Где: Спасск-Дальний Репутация: нет Всего: 1 |
Всем спасибо!
P.S. Короче, учите матчасть, коллега! |
|||
|
||||
![]()
|
| Правила форума "C/C++: Для новичков" | |
|
|
Запрещается! 1. Публиковать ссылки на вскрытые компоненты 2. Обсуждать взлом компонентов и делиться вскрытыми компонентами
Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, JackYF, bsa. |
| 0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей) | |
| 0 Пользователей: | |
| « Предыдущая тема | C/C++: Для новичков | Следующая тема » |
|
|
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности Powered by Invision Power Board(R) 1.3 © 2003 IPS, Inc. |