Відображення ієрархії #include для файлу C ++ у Visual Studio


169

Проблема: У мене є великий проект Visual C ++, який я намагаюся перенести на Visual Studio 2010. Це величезна суміш матеріалів із різних джерел і різного віку. У мене виникають проблеми, тому що щось включає в себе і те, winsock.hі інше winsock2.h.

Запитання: Які інструменти та методи існують для відображення #includeієрархії вихідного файлу Visual Studio C ++?

Я знаю про cl /Pотримання виходу препроцесора, але це не чітко показує, який файл включає, які інші файли (і в цьому випадку /Pвихід становить 376 932 рядків довжиною 8-)

У ідеальному світі я хотів би ієрархічно відображати, які файли містять інші файли, а також номери рядків, щоб я міг перейти до джерел:

source.cpp(1)
  windows.h(100)
    winsock.h
  some_other_thing.h(1234)
    winsock2.h

2
Для людей, які шукають рішення GCC / Clang, використовуйте gcc -H -fsyntax-only ...для виведення ієрархії. Кредити stackoverflow.com/a/18593344/427545
Lekensteyn

Відповіді:


234

Є налаштування:

Параметри проекту -> Властивості конфігурації -> C / C ++ -> Додатково -> Показати Включає

що породить дерево. Він відображає компілятор / showIncludes


20
Примітка: ієрархію можна побачити у вікні виводу.
CannibalSmith

3
Якщо хто -то зацікавлений: навіть якщо ви вибираєте Clang платформи набір інструментів , ви можете «шоу включає в себе» , якщо ви додасте -HвC/C++ -> Command Line - Additional Options
WIP

3
Все ще не так добре, як функція "включено з" gcc, яка показує пряму ієрархію включати помилку часу компіляції, а також відображає номери рядків.
Павло

2
Я зробив швидкий регулярний вираз, який знімає програму Visual Studio (що завгодно під файли програми (x86)). Ви можете скопіювати + вставити своє вихідне вікно в такий додаток, як «Блокнот ++», і з допомогою регулярного вираження знайти та замінити порожнім, щоб зняти всі VS включені з вашого дерева:1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
kjhf

2
Зауважте, що хоча / showIncludes можна перемикати для окремого вихідного файлу, це не матиме ефекту, якщо / showIncludes не встановлено на рівні проекту.
Девід Карр

20

Компілятор також підтримує перемикач / showIncludes - він не дає номерів рядків, але може дати досить вичерпне уявлення про те, що включає походження звідки.

Це в розділі Налаштування проекту -> Властивості конфігурації -> C / C ++ -> Додатково -> Показати включено.


+1 Велике спасибі! (Але я боюся, xtofl отримує Прийняття за швидкість).
RichieHindle

17

Ми виявили, що IncludeManager є дуже потужним інструментом. Це не безкоштовно (але не дорого), і це дозволило нам розібратися з нашими проблемами "Включити" і зменшити час збирання з 50 хвилин на 8 хвилин, обрізаючи великі куски включень, які ми не використовували.


5
Йоу! Я побіг IncludeManager на файл-образливі, і він створив графік, який змусив мене сміятися вголос. За моїми підрахунками, мені знадобиться монітор на 400 ", щоб побачити все. Я думаю, що ми не в силах, щоб допомогти. 8-)
RichieHindle

2
Оновлення - материнська компанія IncludeManager, ProFactor (www.profactor.co.uk) припинила свою діяльність, але надає свої останні випуски безкоштовно з вищевказаного веб-сайту. Нижня сторона полягає в тому, що вона працює лише у повних версіях Visual Studio від VS2005 до VS2013.
Дана

5

Не так добре, як ієрархічна функція gcc, включає функцію, яка показує ієрархію прямої лінії включення у випадку помилки. Варіант "показ включає" в VS показує все, що є надмірним при налагодженні ієрархічної проблеми, що включає файли.


Я чекаю цього вже з 5 років, що я використовував з mingw.
фантастика

2
Можливо, додайте деякі деталі, як ним користуватися, де є документація тощо? Ця відповідь наразі мало додає.
Сем Брайтман

4

Ось хороший сторонній інструмент FOSS. Ви можете експортувати результати в XML, які включатимуть дані про кількість подій та номери рядків.


4

Зараз існує плагін для Visual Studio під назвою IncludeToolbox . Він може перелічити ваші залежні включення та робити більше таких речей, як випадкове видалення та компіляція, щоб побачити, чи потрібно включити цю функцію.



2

cl / P повинен показувати вам номери рядків, щоб ви могли вказати контекст, звідки входить файл заголовка.

Якщо ви зіткнете лінії з ...

grep "^ # рядок" file.i

... тоді ви повинні мати досить чітку інформацію про те, які файли зустрічалися за порядком препроцесора.

Якщо це разовий інцидент, це має бути досить швидкою діагностикою.


2
Звичайно, але це дає мені вісім тисяч рядків неструктурованого виводу, без ієрархії.
RichieHindle

Я досить довго переглядав вихід cl / P і цікавився, чи є кращий інструмент для роботи. Тепер я виявив, що є, що чудово. Питання в цілому, і відповіді будуть тут на SO назавжди, для інших , щоб знайти.
RichieHindle

0

Я використовую Doxygen і GraphViz .

введіть тут опис зображення

Встановіть обидва. Не забудьте вибрати GraphViz як інструмент для генерування діаграм ієрархії. Виберіть "Використовувати інструмент крапки з пакета GraphVix".

Також не забудьте включити бінарний каталог від GraphViz до змінної середовища PATH.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.