тулза, для проверки включения нужных хидероов
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.16 13:16
Оценка:
привет!

к примеру, пишем некоторый библиотечный код. для теста, подключаем его в какой-нить main.cpp, и все вроде бы хорошо, компилиться...
но проблема может быть в том, что в наш main.cpp включаются и хидеры, определения из которых используются в нашем библиотечном коде, потому-то наш main.cpp и скомпилится. в этом случае, если наш библиотечный код включить в другой код, в котором не включены всякие левые хидеры, то он не скомпилится.

вопрос в том, есть ли какая-то тулза, которая берет исходник или хидер, и сообщает нам о том, что недостает какого-то внешнего хидера?


спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Re: Порядок включения хэдеров
От: Qbit86 Кипр
Дата: 20.09.16 13:26
Оценка: 4 (1) +5
Здравствуйте, niXman, Вы писали:

X>но проблема может быть в том, что в наш main.cpp включаются и хидеры, определения из которых используются в нашем библиотечном коде, потому-то наш main.cpp и скомпилится. в этом случае, если наш библиотечный код включить в другой код, в котором не включены всякие левые хидеры, то он не скомпилится.


Поэтому заголовочные файлы нужно включать так, чтобы чем стандартнее, тем позже. То есть вначале включается "MyLib", потом <boost>, потом <std>, etc. В этом случае повышается шанс заметить, что некоторые пререквизиты не включены.
Глаза у меня добрые, но рубашка — смирительная!
Re[2]: Порядок включения хэдеров
От: niXman Ниоткуда https://github.com/niXman
Дата: 20.09.16 19:32
Оценка:
Здравствуйте, Qbit86, Вы писали:

Q>Поэтому заголовочные файлы нужно включать так, чтобы чем стандартнее, тем позже. То есть вначале включается "MyLib", потом <boost>, потом <std>, etc. В этом случае повышается шанс заметить, что некоторые пререквизиты не включены.


я привел просто вариант проблемы. твкой способ не помогает, если речь идет о включении в какой-то библиотечный хидер нескольких других библиотечных хидеров, которые юзер может использовать и по отдельности.

вариантов проблемы наверное несколько, и я думаю что не я первый задался сим вопросом.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Отредактировано 20.09.2016 19:44 niXman . Предыдущая версия .
Re: тулза, для проверки включения нужных хидероов
От: Evgeny.Panasyuk Россия  
Дата: 20.09.16 19:36
Оценка: 19 (2) +1
Нечто подобное:

http://include-what-you-use.org/
include-what-you-use
A tool for use with clang to analyze #includes in C and C++ source files

"Include what you use" means this: for every symbol (type, function variable, or macro) that you use in foo.cc, either foo.cc or foo.h should #include a .h file that exports the declaration of that symbol. The include-what-you-use tool is a program that can be built with the clang libraries in order to analyze #includes of source files to find include-what-you-use violations, and suggest fixes for them.

The main goal of include-what-you-use is to remove superfluous #includes. It does this both by figuring out what #includes are not actually needed for this file (for both .cc and .h files), and replacing #includes with forward-declares when possible.

Re[3]: Порядок включения хэдеров
От: zaufi Земля  
Дата: 21.09.16 14:00
Оценка:
Здравствуйте, niXman, Вы писали:

X>Здравствуйте, Qbit86, Вы писали:


Q>>Поэтому заголовочные файлы нужно включать так, чтобы чем стандартнее, тем позже. То есть вначале включается "MyLib", потом <boost>, потом <std>, etc. В этом случае повышается шанс заметить, что некоторые пререквизиты не включены.


X>я привел просто вариант проблемы. твкой способ не помогает, если речь идет о включении в какой-то библиотечный хидер нескольких других библиотечных хидеров, которые юзер может использовать и по отдельности.


X>вариантов проблемы наверное несколько, и я думаю что не я первый задался сим вопросом.


отчасти помогает вот эта тулза: http://include-what-you-use.org/
недавна в CMake 3.6 приделали возможность ее интеграции в свой проект. но, надо заметить, false positive с ней случается (не помню, можно ли их "задавить")... но в качестве "обзорного" средства вполне себе годится, IMHO
Re[2]: тулза, для проверки включения нужных хидероов
От: VTT http://vtt.to
Дата: 22.09.16 19:47
Оценка:
Здравствуйте, Evgeny.Panasyuk, Вы писали:

EP>Нечто подобное:

EP>

EP>http://include-what-you-use.org/
EP>include-what-you-use


А он работает?
Просто на базе clang постоянно пилят какие-то новые инструменты, но все они застревают в недоделанном состоянии.
Тот же format или verone.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Re: тулза, для проверки включения нужных хидероов
От: OlegMax  
Дата: 23.10.16 16:22
Оценка:
Здравствуйте, niXman, Вы писали:

X>вопрос в том, есть ли какая-то тулза, которая берет исходник или хидер, и сообщает нам о том, что недостает какого-то внешнего хидера?


Я делал на коленке CMake макрос, который перебирал header'ы в директориях, и на каждый генерил .cpp, который включал только этот header, а эти .cpp, в свою очередь добавлялись в проект.
Просто и работает.
file(GLOB_RECURSE SVGPP_HEADERS_HPP RELATIVE  ${CMAKE_CURRENT_SOURCE_DIR}/../../include/svgpp ${CMAKE_CURRENT_SOURCE_DIR}/../../include/svgpp/*.hpp)

foreach(i ${SVGPP_HEADERS_HPP})
    string(REPLACE "/" "_" _name ${i})
    string(REPLACE "." "_" _file_name ${_name})
    set(_file_name "${CMAKE_BINARY_DIR}/${CHECK_HEADERS_DIR}/check_${_file_name}.cpp")
    file(WRITE ${_file_name} "#include <svgpp/${i}>")
    list(APPEND CHECK_HEADERS_SOURCES ${_file_name})
endforeach()

Вот отсюда https://github.com/svgpp/svgpp/blob/master/src/test/CMakeLists.txt
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.