Berkus
удобно
🐙 Antony
Только лучше нессколько тикетов завести, разбив ошибки на компоненты. За разные компоненты отвечают разные люди
Berkus
да, естественно
Berkus
https://svn.boost.org/trac10/ticket/13271
Stanislav
https://svn.boost.org/trac10/ticket/13271
добавил бы версию ндк, какой android api и версии компилятора наверное?
Berkus
там написано все в логе
Berkus
"/usr/local/opt/android-ndk/android-ndk-r16-beta1// toolchains/llvm/prebuilt/darwin-x86_64/bin/clang++" угадай с трех раз
Berkus
https://svn.boost.org/trac10/ticket/13272
Berkus
https://svn.boost.org/trac10/ticket/13273
Berkus
https://svn.boost.org/trac10/ticket/13274
Berkus
whew
Berkus
добавил бы версию ндк, какой android api и версии компилятора наверное?
дописал версию и даже ссылку на user-config.jam приложил
Evgenii
Kirill
Всем привет. Нормально ли при использовании в API библиотеки плюсовых вещей объявлять функции как extern "C"? Например, extern "C" void func(std::function<void()> callback);
Berkus
но если там С++ типов нет в сигнатуре, то почему бы и нет
Berkus
extern "C" просто отключает манглинг имени
Berkus
Вообще-то я попробовал, работает. :)
extern "C" просто отключает манглинг имени два раза могу написать если с первого не понятно
Kirill
Это я понял. Т.е. опасность в том, что если потом поменяется API, а в приложении останется старый заголовочный, то компоновщик ничего не скажет?
Berkus
ага, вообще никто не в курсе будет что что-то изменилось
Berkus
был _func и будет _func
Kirill
Но без extern "C" могут быть проблемы с использованием разных компиляторов?
Berkus
они и с extern "C" будут - скажем стандарт не гарантирует что std::string одного компилятора будет бинарно совместим c std::string другого
Berkus
даже одним компилятором - собери один объектник с libstdc++ а второй с libc++ и попробуй слинковать
Berkus
фейрверк будет красивый
Kirill
Ясно. А как же тогда пишут плюсовые библиотеки? Не все ж из исходников собирать.
Berkus
нормальные библиотеки делают header-only
Kirill
Если библиотека большая и используется в нескольких местах проекта, время сборки сильно увеличится.
Kirill
Можно, конечно, свои обертки написать.
Berkus
либы собираются под конкретный ABI, в нужном количестве
Kirill
Да, но, насколько мне известно, даже при использовании разных версий одного компилятора для одной ОС гарантии совместимости ABI нет.
Billy
Вообще-то я попробовал, работает. :)
попробовал работет, ничего не понял, выкатили в прод — это путь в ад. туда лучше не ходить. Лучше знать, почему оно работает.
Billy
Ох...
продолжай :)
Billy
c 4 на 5?
Evgenii
c 4 на 5?
да, с 4.9 на 5.1
Billy
ну там было известно что АБИ сменят
Billy
конечно, на каждом углу не кричали и с флагим не стояли
Kirill
Да уж понял.
Kirill
Странно, что компилятор не выдает ошибку в таком случае.
Kirill
О том, что отключать name mangling имеет смысл только для функций с примитивными аргументами (и struct).
Kirill
Это я не про extern "C", а про проблемы ABI.
Kirill
В каком еще случае имеет смысл?
Berkus
О том, что отключать name mangling имеет смысл только для функций с примитивными аргументами (и struct).
его имеет смысл отключать только для интерфейсинга с сишными либами, см. например libclang-c
Kirill
Да, но с точки зрения синтаксиса это означает ограничения на типы параметров, возвращаемого значения и отсутствие перегрузок.
Berkus
поэтому он включен )
Andrei
Коллеги, такой вопрос: если сделать конструктор копирования explicit, то получается я никак не смогу вернуть копию объекта из функции через return?
Berkus
Нет не получается
Berkus
Хотя. Хм, зачем делать его таким
Andrei
я просто пытаюсь понять, почему при вызове вызывается только конструктор копирования, а не конструктор дефолтный + оператор=
Andrei
просто теоретический вопрос
Andrei
это я понимаю
Andrei
ну вот этот момент не логичен, потому что не все понимаю:) T creat(); T t; t = creat();
Andrei
я сделал тест, где пишу, что вызывается, к сожалени это не так
Andrei
поэтому и странно
Andrei
если бы все было так, как ты написал, меня бы отпустило :)
Andrei
а
Andrei
так
Andrei
да, сорри
Andrei
просто не там переход на новую строку поставил и не понял свой же вывод
Andrei
все логично
Andrei
спасибо
Berkus
если бы все было так, как ты написал, меня бы отпустило :)
RVO же, плюс оптимизация = в вызов конструктора
Berkus
лишние = давно научились скукоживать
Andrei
ну в моем примере = вызывается
Andrei
как Илья и написал
Andrei
А если ты про оптимизацию вызова конструктора, то да - обрезается до одного, если они идут в подряд и все сводится к одному объекту (или как там компилятор решает)
Berkus
A b = a; эквивалентно A b(a);
Andrei
а если так: T create() { return T(); } T t = create(); то в моем представлении должен вызваться конструктор, потом конструктор копирования для возврата значения из функции, а потом конструктор копирования для построения t. Но все свелось просто к вызову конструтора обычного
Andrei
если что, то вот такой класс: struct T { T() { std::cout << "T()" << std::endl; } T(const T &t) { std::cout << "T(const T &t)" << std::endl; } ~T() { std::cout << "~T()" << std::endl; } T & operator=(const T &t) { std::cout << "T & operator=(const T &t)" << std::endl; return *this; } };
Andrei
Но конструкторы всё равно должны быть определены по стандарту.
Berkus
https://wandbox.org/permlink/YmG1QhWvSyWZXmS7 нет не пошутил