Nikita
это понятно, что стандарт не требует, но сама по себе эта диагностика полезна для локализации детских болезней проекта
Значит, ещё один полезный инструмент в сборке проекта. Одной кнопкой "збс" пока не обошлись
Constantine
//a.h struct Around { struct B { explicit B(std::function<void()> f) : f(f) {}; std::function<void()> f; }; struct SomeStruct { SomeStruct(); B b; }; }; //a.cpp #include "a.h" Around::SomeStruct::SomeStruct() : b([]() {}) { } //b.cpp #include "a.h"
Constantine
почему линкер вижака (14. ...) уверен, что это - ODR violation?
Constantine
если указать nullptr вместо [](){}, то никаких проблем
Anatoly
бага
Constantine
голосую, что я не понимаю какой-то безумно тонкий момент
Anatoly
едва ли
Constantine
//a.cpp #include "a.h" std::function<void()> get_f() { return []() {}; } Around::SomeStruct::SomeStruct() : b(get_f()) { } все ок
Constantine
запускается link.exe [...] /ODR
Constantine
User defined type 'Around::SomeStruct' has different definitions or layouts in the following modules:
Constantine
Это warning из-за включенного /ODR
Constantine
голосую, что я не понимаю какой-то безумно тонкий момент
Например, фишка в том, чем является лямбда в списке инициализации
🦥Alex Fails
В списке инициализации нету нпявных кастов
Constantine
Это компилируется, если что
Constantine
да, только ее использование синтезировало тип
Aidar
возможно это чтото в кишках std function
Constantine
указанная ошибка означает, что у типа Around::SomeStruct разные определения
Constantine
а не у std::function
Constantine
или есть?
Aidar
где
Aidar
все типы заранее известныничего не генерится
Aidar
кроме очевидно кишков std function
Anatoly
или есть?
это реализация конструктора
Constantine
линкер утверждает, что вот эта строка модифицирует определение типа Around::SomeStruct Around::SomeStruct::SomeStruct() : b([]() {})
Anatoly
это бага анализатора нарушения ODR
Constantine
почему?
Aidar
может и бага
Aidar
может и кишки стд функшн
Aidar
в любом случае нужно забить
Constantine
мне вот говорят, что это ill-formed
Aidar
кто конкретно
Aidar
[](){} объект - функтор неизвестного типа
Aidar
все
Constantine
ну наличие ODR violation делает программу ill-formed
Aidar
скомпиль другим компилятором
Constantine
или обращения к классу, забыл
Constantine
или ты про пример
Anatoly
почему?
почему это бага анализатора? хз, поскольку здесь нет нарушения ODR
Aidar
Constantine
почему это бага анализатора? хз, поскольку здесь нет нарушения ODR
я категорически не уверен, что линкер может ошибиться в определении ODR violation
Anatoly
я категорически не уверен, что линкер может ошибиться в определении ODR violation
ну обычно такие утверждения должны ссылаться на конкретный пункт стандарта, который нарушается в данном случае
Anatoly
я такого пункта найти не могу
Anatoly
может Антон поможет
Aidar
@antoshkka
Constantine
и у меня нет ни малейшей идеи, как это гуглить
Anatoly
да здесь не гуглить, здесь штудировать стандарт надо
Anatoly
Anatoly
линкер утверждает, что вот эта строка модифицирует определение типа Around::SomeStruct Around::SomeStruct::SomeStruct() : b([]() {})
реализация конструктора в данном случае не является часть определения класса, это отдельно вынесенная реализация конструктора класса, на которую накладывается свое правило ODR
Mikhail
А что у нас, cmake не умеет precompiled headers?
Mikhail
не могу найти как выставить
Крылатый
Через жопу умеет.
Крылатый
Оно ж копилезависимое.
Mikhail
мда
Крылатый
Советую опробовать вот это: https://github.com/sakra/cotire
Крылатый
Оно там обмазано и включеня все эти PH.
Mikhail
ну что сказать, я удивлен конечно
Anatoly
А что у нас, cmake не умеет precompiled headers?
stdafx.cpp должен быть помечен как создающий pch set_source_files_properties(stdafx.cpp PROPERTIES COMPILE_FLAGS "/Yc\"${THIS_LIB_PCH}\"" ) а все исходные файлы, что используют pch должны его включить set_source_files_properties(${source} PROPERTIES COMPILE_FLAGS "/Yu\"${THIS_LIB_PCH}\"" )
Anatoly
вместо ${THIS_LIB_PCH} имя твоего проекта
Mikhail
Да, спасибо
Mikhail
выглядит как костыль конечно и нужно будет переделывать cmake проект
Mikhail
так что пока забью :)
Anatoly
чтобы не страдать, мы написали свою макро обвязку
Anatoly
rolis_library( smartcard COMPILE_FLAGS -D_AFXDLL -D_MBCS -DROLIS_SMARTCARD_EXPORTS SOURCES ${rolis_SOURCE_DIR}/rolis/SmartCard.h SmartCard.cpp StdAfx.h PCH StdAfx.h PCH_SOURCE StdAfx.cpp DEPENDS subclass LINK_LIBS winscard rpcrt4 MFC )
Anatoly
ну а уже в макросе обрабатываем как нам требуется PCH
Mikhail
Т.е. вы создали PCH команду?
Mikhail
и PCH_SOURCE
Anatoly
нет, написали макрос который внутри делает всю грязную работу
Anatoly
теже set_source_files_properties только внутри макроса
Крылатый
А можно взять cotire)
Anatoly
наверняка cotire это делает лучше, поскольку поддерживает все современные компиляторы
Крылатый
Да, потому и советую.
Anatoly
я хотел лишь показать, что ничего под катом волшебного нет
Крылатый
Справедливо!