к примеру, пишем некоторый библиотечный код. для теста, подключаем его в какой-нить main.cpp, и все вроде бы хорошо, компилиться...
но проблема может быть в том, что в наш main.cpp включаются и хидеры, определения из которых используются в нашем библиотечном коде, потому-то наш main.cpp и скомпилится. в этом случае, если наш библиотечный код включить в другой код, в котором не включены всякие левые хидеры, то он не скомпилится.
вопрос в том, есть ли какая-то тулза, которая берет исходник или хидер, и сообщает нам о том, что недостает какого-то внешнего хидера?
спасибо!
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
Здравствуйте, niXman, Вы писали:
X>но проблема может быть в том, что в наш main.cpp включаются и хидеры, определения из которых используются в нашем библиотечном коде, потому-то наш main.cpp и скомпилится. в этом случае, если наш библиотечный код включить в другой код, в котором не включены всякие левые хидеры, то он не скомпилится.
Поэтому заголовочные файлы нужно включать так, чтобы чем стандартнее, тем позже. То есть вначале включается "MyLib", потом <boost>, потом <std>, etc. В этом случае повышается шанс заметить, что некоторые пререквизиты не включены.
Здравствуйте, Qbit86, Вы писали:
Q>Поэтому заголовочные файлы нужно включать так, чтобы чем стандартнее, тем позже. То есть вначале включается "MyLib", потом <boost>, потом <std>, etc. В этом случае повышается шанс заметить, что некоторые пререквизиты не включены.
я привел просто вариант проблемы. твкой способ не помогает, если речь идет о включении в какой-то библиотечный хидер нескольких других библиотечных хидеров, которые юзер может использовать и по отдельности.
вариантов проблемы наверное несколько, и я думаю что не я первый задался сим вопросом.
пачка бумаги А4 стОит 2000 р, в ней 500 листов. получается, лист обычной бумаги стОит дороже имперского рубля =)
"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.
Здравствуйте, niXman, Вы писали:
X>Здравствуйте, Qbit86, Вы писали:
Q>>Поэтому заголовочные файлы нужно включать так, чтобы чем стандартнее, тем позже. То есть вначале включается "MyLib", потом <boost>, потом <std>, etc. В этом случае повышается шанс заметить, что некоторые пререквизиты не включены.
X>я привел просто вариант проблемы. твкой способ не помогает, если речь идет о включении в какой-то библиотечный хидер нескольких других библиотечных хидеров, которые юзер может использовать и по отдельности.
X>вариантов проблемы наверное несколько, и я думаю что не я первый задался сим вопросом.
отчасти помогает вот эта тулза: http://include-what-you-use.org/
недавна в CMake 3.6 приделали возможность ее интеграции в свой проект. но, надо заметить, false positive с ней случается (не помню, можно ли их "задавить")... но в качестве "обзорного" средства вполне себе годится, IMHO
Re[2]: тулза, для проверки включения нужных хидероов
А он работает?
Просто на базе clang постоянно пилят какие-то новые инструменты, но все они застревают в недоделанном состоянии.
Тот же format или verone.
Говорить дальше не было нужды. Как и все космонавты, капитан Нортон не испытывал особого доверия к явлениям, внешне слишком заманчивым.
Здравствуйте, niXman, Вы писали:
X>вопрос в том, есть ли какая-то тулза, которая берет исходник или хидер, и сообщает нам о том, что недостает какого-то внешнего хидера?
Я делал на коленке CMake макрос, который перебирал header'ы в директориях, и на каждый генерил .cpp, который включал только этот header, а эти .cpp, в свою очередь добавлялись в проект.
Просто и работает.