Nikita
Berkus
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())
{
}
все ок
Stanislav
Constantine
запускается
link.exe [...] /ODR
Constantine
User defined type 'Around::SomeStruct' has different definitions or layouts in the following modules:
Constantine
Это warning из-за включенного
/ODR
🦥Alex Fails
В списке инициализации нету нпявных кастов
Constantine
Это компилируется, если что
Aidar
Constantine
да, только ее использование синтезировало тип
Aidar
возможно это чтото в кишках std function
Constantine
указанная ошибка означает, что у типа Around::SomeStruct разные определения
Constantine
а не у std::function
Aidar
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
Constantine
или ты про пример
Anatoly
почему?
почему это бага анализатора? хз, поскольку здесь нет нарушения ODR
Aidar
Anatoly
я такого пункта найти не могу
Anatoly
может Антон поможет
Constantine
Aidar
@antoshkka
Constantine
и у меня нет ни малейшей идеи, как это гуглить
Anatoly
да здесь не гуглить, здесь штудировать стандарт надо
Anatoly
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
Mikhail
Т.е. вы создали PCH команду?
Mikhail
и PCH_SOURCE
Anatoly
нет, написали макрос который внутри делает всю грязную работу
Anatoly
теже set_source_files_properties только внутри макроса
Крылатый
А можно взять cotire)
Anatoly
наверняка cotire это делает лучше, поскольку поддерживает все современные компиляторы
Крылатый
Да, потому и советую.
Anatoly
я хотел лишь показать, что ничего под катом волшебного нет
Крылатый
Справедливо!