แสดงลำดับชั้น #include สำหรับไฟล์ C ++ ใน Visual Studio


169

ปัญหา:ฉันมีโครงการ Visual C ++ ขนาดใหญ่ที่ฉันพยายามย้ายไปยัง Visual Studio 2010 มันเป็นการผสมผสานกันอย่างมากของสิ่งต่าง ๆ จากแหล่งที่มาที่หลากหลายและทุกวัย ฉันได้รับปัญหาเพราะสิ่งที่เป็นทั้งและwinsock.hwinsock2.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
ฉันทำ regex อย่างรวดเร็วที่รวมแถบ Visual Studio (ทุกสิ่งภายใต้ Program Files (x86)) คุณสามารถคัดลอก + วางหน้าต่างเอาท์พุทของคุณลงในแอพอย่าง Notepad ++ และทำการค้นหา regex และแทนที่ด้วยช่องว่างเพื่อตัด VS ทั้งหมดที่มีจาก1>\s*Note: including file:\s*C:\\Program Files \(x86\).*(\r\n|\n|$)
แผนผัง

2
โปรดทราบว่าในขณะที่ / showIncludes สามารถสลับสำหรับไฟล์ต้นฉบับแต่ละไฟล์จะไม่มีผลเว้นแต่ว่า / showIncludes ตั้งอยู่ที่ระดับโครงการ
David Carr

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 เท่านั้น
Dana

5

ไม่ดีเท่ากับคุณลักษณะการรวมลำดับชั้นของ gcc ซึ่งแสดงลำดับชั้นการรวมบรรทัดโดยตรงในกรณีที่เกิดข้อผิดพลาด ตัวเลือก "show include" ใน VS แสดงทุกอย่างซึ่งเกินความจริงเมื่อการดีบักลำดับชั้นรวมถึงปัญหาไฟล์


ฉันรอสิ่งนี้จาก 5 ปีแล้วซึ่งฉันใช้กับ mingw
fantastory

2
อาจเพิ่มรายละเอียดบางอย่างเกี่ยวกับวิธีใช้งานซึ่งเป็นเอกสารเป็นต้น คำตอบนี้ไม่ได้เพิ่มมากในขณะนี้
Sam Brightman

4

นี่คือเครื่องมือ FOSS ของบุคคลที่สามที่ดี คุณสามารถส่งออกผลลัพธ์ไปยัง XML ซึ่งจะรวมข้อมูลตามจำนวนที่เกิดขึ้นและหมายเลขบรรทัด


4

ขณะนี้เป็นปลั๊กอินสำหรับ Visual Studio เรียกIncludeToolbox มันสามารถแสดงรายการของคุณรวมถึงและทำสิ่งต่าง ๆ เช่นสุ่มลบและรวบรวมเพื่อดูว่าจำเป็นต้องมีการรวม



2

cl / Pควรแสดงหมายเลขบรรทัดเช่นคุณสามารถบอกบริบทของการรวมไฟล์ส่วนหัวได้

หากคุณ grep ออกบรรทัดด้วย ...

grep "^ # line" file.i

... จากนั้นคุณควรมีตัวบ่งชี้ที่ชัดเจนว่าไฟล์ใดที่พบตามลำดับโดยตัวประมวลผลล่วงหน้า

หากเป็นเหตุการณ์ที่เกิดขึ้นครั้งเดียวควรเป็นการวินิจฉัยที่รวดเร็ว


2
แน่นอน แต่นั่นให้ผลลัพธ์แปดหมื่นบรรทัดโดยไม่มีลำดับชั้น
RichieHindle

ฉันดูผ่านเอาต์พุต cl / P มานานพอและสงสัยว่ามีเครื่องมือที่ดีกว่าสำหรับงานนี้หรือไม่ ตอนนี้ฉันได้ค้นพบแล้วว่ามันยอดเยี่ยมมาก คำถามนี้เป็นคำถามทั่วไปและคำตอบจะอยู่ที่นี่ตลอดไปเพื่อให้คนอื่นค้นพบ
RichieHindle

0

ฉันใช้DoxygenและGraphViz

ป้อนคำอธิบายรูปภาพที่นี่

ติดตั้งทั้งสอง ตรวจสอบให้แน่ใจว่าได้เลือก GraphViz เป็นเครื่องมือในการสร้างลำดับชั้นไดอะแกรม เลือก "ใช้เครื่องมือจุดจากแพ็คเกจ GraphVix"

ตรวจสอบให้แน่ใจว่าได้รวมไดเรกทอรีไบนารีจาก GraphViz ลงในตัวแปรสภาพแวดล้อม PATH ของคุณ

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.