Constantine
потому что если inline-подстановка фактически не выполнена, объектник экспортирует функцию и все пойдет как надо
Constantine
а если выполнена, то будет ошибка линковки из-за отсутствия использованной функции
Constantine
я не знаю, что там с inline-переменными из 17 стандарта
Constantine
ах да, еще стандарт гарантирует, что inline-функция в разных TU имеет одинаковый адрес
Matwey
зачем ей вообще адрес?
Constantine
чтобы его взять
Berkus
зачем ей вообще адрес?
потому что разрешается брать адрес функции
Berkus
ну и по следствию... он должен быть
Matwey
потому что разрешается брать адрес функции
А что будет, если его взять и отдать C-шной библиотеке в качестве callback-а?
Constantine
то же, что и с любой другой функцией
Constantine
в частности, чуть что не так - все сломается, но если не тайпкастить все окнорм
Constantine
при этом взятие адреса функции является чудесным случаем, когда результат оператора зависит от типа, которому будет присваивание :)
Constantine
об этом есть много букав под названием "address of overloaded function"
Constantine
причем этот раздел плачет еще по некоторому набору букав
Matwey
https://github.com/trailofbits/remill а из этой штуки получится сделать статический бинарный транслятор? если LLVM потом пропустить опять в прямом направлении под другую архитектуру?
Berkus
llvm bitcode есть нескольких уровней
Berkus
если это более высокого уровня биткод, то должно получиться, поиграйся, это можно обычными llvm тулами сделать
Andrei
А еще такой вопрос по inline. Объявил я функцию класса как inline в .hpp, а определил в .cpp. Код не компилируется в таком случае, хотя при компиляции код функции создается. А если я эту же функцию в том же .cpp, где она определена, где-то использую, то и в других местах кода я могу ее использовать. Как это работает?
Andrei
А то не могу допереть даже момент с простым определением в отдельном файле. Почему компилятор не видит. Какая разница где функция определена, пусть она и inline помечена. Тем более, раз это только рекомендация
Matwey
Так встраивание же происходит и на этапе компиляции?
Matwey
Ну я имею ввиду, что нам обещают, что потом оптимизатор еще и по АСТ проедет вслед.
Matwey
Это утром обсудили уже
Andrei
Это утром обсудили уже
я только что прочитал наискосок переписку и не увидел, можете тыкнуть?
Andrei
вопрос именно "почему":)
Matwey
А это по-моему не он
Andrei
я другой
Matwey
Можно вроде, но inline будте работать только в этой единице трансляции. Разве нет?
Andrei
из-за ваших обсуждений и возник вопрос
Andrei
ладно, если не будет работать инлайн, так в других .cpp при подключении хедера не видит функцию и вообще не компилируется
Berkus
auto main() { auto auto; return auto; }
Matwey
Это тоже обсудили утром. Решили, что если в заголовках пишешь тело функции вне определения класса, нужно писать inline, чтобы линкер смог потом слинковать разные единицы трансляции с одинаковым символом.
Andrei
///foo.hpp #ifndef foo_h #define foo_h class Foo { public: inline void foo(); }; #endif /* foo_h */ ///foo.cpp #include <iostream> #include "foo.hpp" void Foo::foo() { std::cout « "Foo::foo()" « std::endl; } ///main.cpp #include "foo.hpp" int main() { Foo foo; foo.foo(); return 0; } Ошбика при компиляции: "Foo::foo()", referenced from: _main in main.o
Andrei
а если добавить в foo.cpp например такой кусок: void bar() { Foo f; f.foo(); } То все компилится и линкуется
Andrei
xcode/clang
Square
На ios не делается :(
Square
Ну тут есть 5 видов апострофов и ни один не подходит
Andrei
как их тут добавить?
Square
У Полухина про инлайны есть доклад
Square
И там почти так и сказано - забудьте
Square
И в принципе прально
Square
Д
Andrei
///foo.hpp #ifndef foo_h #define foo_h class Foo { public: inline void foo(); }; #endif /* foo_h */ ///foo.cpp #include <iostream> #include "foo.hpp" void Foo::foo() { std::cout « "Foo::foo()" « std::endl; } ///main.cpp #include "foo.hpp" int main() { Foo foo; foo.foo(); return 0; } Ошбика при компиляции: "Foo::foo()", referenced from: _main in main.o
Кажется понял. Из-за правила ODR каждое объявление inline-функции должно быть определено в каждой единице трансляции получается. Получается, компилятор создает отдельно код inline-функции (имею в виду как модуль), но она не имеет адреса и видна только там, где определена. Поправьте, если не прав
Square
ссылочку найдешь?
https://youtu.be/rJWSSWYL83U?t=1930
Square
если чо, с 32й минуты сабж
Berkus
ааа, это я смотрю, не досмотрел до 32 минуты еще
Berkus
спс
ttldtor
Эх, прошли те времена, когда из яндекса вываливались артефакты классиков типа Mtroka/Stroka ... а не, нашёл https://github.com/yandex/balancer/blob/master/util/generic/stroka.h
Крылатый
> stroka::compare
ttldtor
блин, не Mtroka, а Wtroka
ttldtor
это я в контексте первых минут видео...
ttldtor
https://github.com/yandex/balancer/blob/master/util/generic/stroka.h#L43
Berkus
запустить vim? поставить CLion? куча вариантов
Anatoly
узнаю руку Мастера! :)))
Evgenii
надо было ставить линукс.jpeg
Andre
не благодари
Evgenii
ну а в чем проблема тогда?
Evgenii
ну и фиг с ней
ep
ну и фиг с ней
Отличный совет вообще. Представьте, что у вас такая ситуация, будет не до смеха. Я сталкивался с чем-то подобным. Кривой устновщик расширения ломал студию. Мы долго что-то вычищали руками, и оно всё же заработало. Но я совершенно не помню, что и где надо править. Студия довольно капризная, если её что-то сломало, бывают ситуации когда помогает только переустановка винды, реально. Переустановка студии не помогает.
Anatoly
Ильюха, я не знаю как тебе помочь
Constantine
Anatoly
"Узнаю руку Мастера" (с) мой :)
Nikolai
ухахаха
Stanislav
шо ты там делаешь
Stanislav
вот понмю времена XP студия не ставилась, потому что не ставился .net framework, который с свою очередь не ставился из за отключенных обновлений
Stanislav
подозриельна, заводил под вин 10 годовалой давности 2012 студию поверх 2015, юзал тулчнейн 2012 из 2015
Anonymous
Admin
Крылатый
Admin
Что нужно?
Anonymous
В первый раз вижу админов в этом чате
Крылатый
Тут их полчата.