powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT Creator (min-gw?) не любит inline в cpp?
17 сообщений из 17, страница 1 из 1
QT Creator (min-gw?) не любит inline в cpp?
    #39107247
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Привет, All.

Поставил свежий QT Creator с компилятором min-gw в комплекте и обнаружил забавный сюрприз. Если у вас в объявлении или определении функции используется слово 'inline', а само определение вынесено в cpp файл, то собрать проект не удастся - пойдут ошибки 'undefined reference'. Хотя, это скорее привет от компилятора...

Это только у меня так, или действительно нельзя выносить реализацию inline-функций в cpp-файлы?
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107252
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaЭто только у меня так, или действительно нельзя выносить реализацию
inline-функций в cpp-файлы?
Ты, очевидно, не понимаешь, что такое inline и что она делает с генерируемым кодом.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107281
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BagaBagaПривет, All.
...
Это только у меня так, или действительно нельзя выносить реализацию inline-функций в cpp-файлы?
Вообще то было можно, но они в этом случае не инлайнятся.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107293
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглВообще то было можно, но они в этом случае не инлайнятся.
Скорее всего у незаинлайненных inline функций статическая видимость (в пределах файла).
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107361
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovBagaBagaЭто только у меня так, или действительно нельзя выносить реализацию
inline-функций в cpp-файлы?
Ты, очевидно, не понимаешь, что такое inline и что она делает с генерируемым кодом.

Спасибо, КЭП. Я спросил ровно то, что не понимаю.

Про inline - это подсказка компилятору, не более того, что вместо вызова данной функции по месту её "вызова" можно подставить её бинарный код. Это сокращает накладные расходы на вызов функции. И имеет смысл только для "коротких" функций. Т.к. подстановка "больших" функций приводит к "разбуханию" исполняемого кода. В прочем, как любая подсказка, inline ничего не гарантирует - компилятор имеет полное право её проигнорировать и всё равно вставить вызов функции (а не подстановку).
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107364
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
а, забыл добавить, с чего это...

Некий С++ гуру (можно найти и ссылочку, но под рукой нет) советует выносить директивы inline (и реализацию функций) из заголовочных файлов в cpp-файлы. Мотивация такая: заголовочный файл - это предоставляемый пользователю интерфейс. Интерфейс должен (чтобы не вводить в "искушение") скрывать детали реализации. inline - это "деталь реализации", и потому как любая деталь должна быть из интерфейса исключена.

Для меня вполне понятно, когда компилятор не может применить inline-оптимизацию, если объявление и тело встраиваемой функции разнесены. В конце концов, на корректность программы это не влияет, просто она может быть немного медленнее (и то не факт). Но для меня удивительно, что это может привести к ошибкам компиляции (inline же не должен влиять на сигнатуру функции).
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107664
Dimitry Sibiryakov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagainline - это подсказка компилятору, не более того, что вместо вызова данной
функции по месту её "вызова" можно подставить её бинарный код.
А теперь подумай, как и какой код компилятор должен засунуть в объектный файл при
компиляции файла А, если в нём используется функция, реализованная в файле Б.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39107769
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для inline подстановки требуется исходник функции. Если он скрыт в cpp, то надо извратиться, чтобы его оттуда достать.

По сути inline это то же шаблон, т.е. механизм генерации кода. В данном случае код генерится по месту вызова inline функции.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108210
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabДля inline подстановки требуется исходник функции. Если он скрыт в cpp, то надо извратиться, чтобы его оттуда достать.

По сути inline это то же шаблон, т.е. механизм генерации кода. В данном случае код генерится по месту вызова inline функции.

На самом деле всё это не так.

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

Я не знаю про GCC, а вот microsoft-овский компилятор
плюёт на inline с высокой колокольни, ему всё равно, что ты там ему обозвал.

подставляет тела функций сам, по своему разумению

использует для этого дополнительный шаг глобальной оптимизации, при сборке.

По GCC -- думаю, там просто в опциях форсанули inline, надо поглядеть опции командной строки вызова компилятора и линкера.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108338
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну что там смотреть то? Открываем документацию и читаем до просветления.
https://gcc.gnu.org/onlinedocs/gcc/Inline.html
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108339
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dimitry SibiryakovBagaBagainline - это подсказка компилятору, не более того, что вместо вызова данной
функции по месту её "вызова" можно подставить её бинарный код.
А теперь подумай, как и какой код компилятор должен засунуть в объектный файл при
компиляции файла А, если в нём используется функция, реализованная в файле Б.


Dimitry, технически здесь ничего невозможного нет. Разумеется, если это делать не в один проход. Мой старый компилятор такое проглатывал без ошибок. Правда, и подстановку не делал.

Для себя я нашёл ответ на ISO C++
https://isocpp.org/wiki/faq/inline-functions Note: It’s imperative that the function’s definition (the part between the {...}) be placed in a header file, unless the function is used only in a single .cpp file. In particular, if you put the inline function’s definition into a .cpp file and you call it from some other .cpp file, you’ll get an “unresolved external” error from the linker.

Вероятно, можно докопаться и до пункта стандарта, требующего этого. Но это не принципиально, по крайней мере для меня. Жаль только, что для этого потребовалось двое суток...
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108341
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBaga,

А ларчик открывался очень просто: не используй ключевое слово inline. Никогда не используй. Не нужно оно. Вообще.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108343
Зимаргл
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
White Owl,

На правах пятницы. Не нужен 7-9ти проходный компилятор, вообще.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108352
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглWhite Owl,

На правах пятницы. Не нужен 7-9ти проходный компилятор, вообще.Вот когда ты поживешь на десятке разных компиляторов, да потаскаешь между ними проекты. Вот тогда ты поймешь что плевать надо на всяческие "улучшения" языка и использовать только самый минимум синтаксиса. И тогда тебе будет без разницы сколько проходов делает компилятор. Базовый синтаксис, без финтифлюшек, понятен всем компиляторам (и даже людям) без дополнительных игр с ключами.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108360
mcureenab
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
White OwlBagaBaga, А ларчик открывался очень просто: не используй ключевое слово inline. Никогда не используй. Не нужно оно. Вообще.Да ладно! inline это замена #define. Причем, вызов макроса и функции выглядят в тексте одинаково, но макрос может работать иначе.
наивная реализация max:
Код: plaintext
1.
#define max(a, b) ( a < b ? b : a )

может стать неожиданностью:
Код: plaintext
1.
max(i++, j++)

->
Код: plaintext
1.
( i++ < j++ : j++ : i++ )

Тогда как с inline реализацией max все проще и надежнее. Компилятор сразу проверяет синтаксис, а вызов семантически не отличается от вызова обычной функции.
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108394
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ЗимарглНа правах пятницы. Не нужен 7-9ти проходный компилятор, вообще.
действительно, 7-9 это очень мало
...
Рейтинг: 0 / 0
QT Creator (min-gw?) не любит inline в cpp?
    #39108412
White Owl
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
mcureenabТогда как с inline реализацией max все проще и надежнее. Компилятор сразу проверяет синтаксис, а вызов семантически не отличается от вызова обычной функции.В inline нет смысла, потому что оптимизатор сам способен развернуть микро-функции если это выгодно. И не важно если они объявлены или не объявлены как inline.
...
Рейтинг: 0 / 0
17 сообщений из 17, страница 1 из 1
Форумы / C++ [игнор отключен] [закрыт для гостей] / QT Creator (min-gw?) не любит inline в cpp?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]