![]() |
|
Модераторы: 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 вечная память. Обсуждение действий администрации форума производятся только в этом форуме гениальность идеи состоит в том, что ее невозможно придумать |
|||
|
||||
![]()
|
| Правила форума "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. |