กำลังตรวจจับ #includes ที่ฟุ่มเฟือยใน C / C ++?


289

ฉันมักจะพบว่าส่วนหัวของไฟล์มีขนาดใหญ่ขึ้นเรื่อย ๆ ตลอดเวลา แต่ก็ไม่เคยเล็กลง ตลอดอายุการใช้งานของคลาสไฟล์ต้นฉบับอาจมีการย้ายและถูกปรับโครงสร้างใหม่และเป็นไปได้มากที่มีจำนวนไม่มาก#includesที่ไม่จำเป็นต้องอยู่ที่นั่นอีกต่อไป ปล่อยให้พวกเขามีเพียงเวลาในการรวบรวมและเพิ่มการพึ่งพาการรวบรวมที่ไม่จำเป็น การพยายามคิดให้ได้ว่าอะไรที่ยังต้องการอยู่นั้นค่อนข้างน่าเบื่อ

มีเครื่องมือบางชนิดที่สามารถตรวจจับคำสั่ง #include ที่ฟุ่มเฟือยและแนะนำเครื่องมือที่ฉันสามารถลบได้อย่างปลอดภัยหรือไม่?
ผ้าสำลีทำสิ่งนี้ได้ไหม?


1
ดูเพิ่มเติมที่: stackoverflow.com/questions/74326/…
Eclipse

1
คำถามที่เชื่อมโยงดูเหมือนจะแก้ไขปัญหาใน Windows โดยใช้ Visual Studio เป็นพิเศษเท่านั้น
D'Nabre

7
การลงคะแนนเพื่อเปิดใหม่เนื่องจากการซ้ำซ้อนเกี่ยวกับการใช้ Visual Studio โดยเฉพาะ
Drew Dormann

คำตอบ:


42

มันไม่อัตโนมัติ แต่doxygenจะสร้างไดอะแกรมการพึ่งพาสำหรับ#includedไฟล์ คุณจะต้องผ่านมันไปด้วยสายตา แต่มันจะมีประโยชน์มากสำหรับการถ่ายรูปสิ่งที่กำลังใช้


5
นี่เป็นวิธีที่ดีในการดูโซ่ .. การได้เห็น A -> B -> C -> D และ A -> D เผยให้เห็นความซ้ำซ้อนในทันที
Tom

34
@ ทอม: นั่นเป็นความคิดที่น่ากลัว: สำหรับหนึ่งมันไม่ได้แสดงว่าจำเป็นต้องมีหรือไม่และที่สองรายการของการรวมไม่ควรขึ้นอยู่กับทางอ้อมรวมถึงที่อาจมีการเปลี่ยนแปลงในอนาคต (ซ้ำซ้อนมักจะไม่ ปัญหาใหญ่เลยล่ะค่ะขอบคุณที่จะรวมถึงยามและเวทมนตร์คอมไพเลอร์) แต่ที่เรียน / ฟังก์ชั่นที่มีการใช้จริงในแฟ้ม (คอมไพเลอร์ของคุณไม่ควรจะต้องไปผ่านพันสายรหัสแม่แบบที่ไม่ได้รับอินสแตนซ์)
MikeMB

@albert คุณสามารถรวมภาพหน้าจอของสิ่งนี้และอธิบายสั้น ๆ ว่าจะคลิกที่ใดในเอาต์พุต doxygen?
Gabriel Staples

@GabrielStaples มันไม่ใช่คำตอบของฉันดังนั้นฉันไม่ต้องการเพิ่มข้อมูลเข้าไป ฉันแก้ไขลิงก์เท่านั้น (เนื่องจากเป็นพื้นที่ที่เรียกว่าหยุด / ยึดเพื่อใช้)
อัลเบิร์ต

177

cppclean Google (เชื่อมโยงไปยัง: ดาวน์โหลด , เอกสาร ) สามารถค้นหาหลายประเภทของปัญหา C ++ และตอนนี้ก็สามารถหา #includes ฟุ่มเฟือย

นอกจากนี้ยังมีเครื่องมือที่ใช้เสียงดังกราวรวมถึงสิ่งที่คุณใช้ซึ่งสามารถทำได้ รวมถึงสิ่งที่คุณใช้งานยังสามารถแนะนำการประกาศล่วงหน้า (ดังนั้นคุณไม่ต้อง #include มาก) และเลือกที่จะล้าง #includes ให้คุณ

เวอร์ชันปัจจุบันของEclipse CDTยังมีฟังก์ชันนี้อยู่ภายใน: ไปที่เมนูแหล่งที่มาและการคลิกจัดระเบียบการรวมจะเรียงลำดับ # รวมของคุณตามตัวอักษรเพิ่มส่วนหัวใด ๆ ที่ Eclipse คิดว่าคุณกำลังใช้โดยไม่รวมถึงพวกเขาโดยตรง คิดว่าคุณต้องการ อย่างไรก็ตามคุณลักษณะนี้ไม่น่าเชื่อถือ 100%


2
มันทำตอนนี้ ฉันเพิ่งเริ่มใช้มัน ดูบันทึกของฉันที่นี่ stackoverflow.com/questions/1301850/…
โอกาส

1
พื้นที่เก็บข้อมูล cppclean ไม่ทำงานคุณสามารถรับได้ที่นี่: bitbucket.org/robertmassaioli/cppclean (ไซต์ดั้งเดิมยังคงมีประโยชน์สำหรับการใช้งานตัวอย่างบางอย่าง)
Nick

3
ฉันอัปเดตลิงก์ไปยัง cppclean fork ที่ดูแลแล้ว: github.com/myint/cppclean
BenC

1
โปรดทราบว่า cppclean ดูเหมือนจะค้นหาได้เฉพาะในไฟล์ส่วนหัวไม่ใช่ไฟล์ cpp จากเอกสาร: "ไม่จำเป็น # รวมในไฟล์ส่วนหัว"
Zitrax

1
@ wizurd - ฉันไม่ได้ติดตามพัฒนาการล่าสุดใน Eclipse CDT แต่ฉันไม่คิดอย่างนั้น iwyu นั้นถี่ถ้วนและค่อนข้างช้า การวิเคราะห์ของ Eclipse CDT นั้นรวดเร็ว (โต้ตอบ) และเมื่อฉันทดสอบมันก็แม่นยำน้อยลง
Josh Kelley

65

นอกจากนี้ตรวจสอบรวมถึงสิ่งที่คุณใช้ซึ่งแก้ไขปัญหาที่คล้ายกัน


6
IMHO คำตอบนี้ต้องการ upvotes มากขึ้นเนื่องจากเมื่อ kinks ทำงานได้ดีเครื่องมือ IWYU ของ Google จะเป็นเครื่องมือขั้นสุดท้ายสำหรับงานนี้
Dan Olson

5
sudo apt-get install iwyu
Andrew Wagner

ดูเหมือนว่ายอดเยี่ยม - กับ cavaets สองอัน 1) อัปเดตล่าสุด ก.พ. 2106 2) โกกอลใช้สำหรับ C ++ เท่านั้นไม่ใช่ C ซึ่ง OP ต้องการ
Mawg พูดว่าคืนสถานะโมนิก้า

คุณช่วยอธิบายได้นิดหน่อยว่าผู้ใช้ควรใช้มันอย่างไร? README ไม่ค่อยชัดเจนเกี่ยวกับสิ่งที่มีเอาต์พุตของสคริปต์ไพ ธ อน
ตัวตลกของราชา

ฉันใช้สิ่งนี้ แต่มันไม่ถูกต้อง 100% เสมอ อาจจะ 70% เท่าที่ให้คำแนะนำที่ถูกต้อง
InQusitive

25

ปัญหาเกี่ยวกับการตรวจจับการรวมฟุ่มเฟือยคือมันไม่สามารถเป็นแค่ตัวตรวจสอบการพึ่งพาประเภท การรวมฟุ่มเฟือยเป็นไฟล์ที่ไม่มีค่าใด ๆ ในการรวบรวมและไม่เปลี่ยนแปลงรายการอื่นที่ไฟล์อื่น ๆ พึ่งพา มีหลายวิธีที่ไฟล์ส่วนหัวสามารถแก้ไขการคอมไพล์พูดโดยกำหนดค่าคงที่กำหนดใหม่และ / หรือลบมาโครที่ใช้แล้วเพิ่มเนมสเปซซึ่งจะเปลี่ยนแปลงการค้นหาชื่อในแบบลงบรรทัด ในการตรวจจับรายการเช่นเนมสเปซที่คุณต้องการมากกว่าตัวประมวลผลล่วงหน้าคุณอันที่จริงแล้วคุณต้องการคอมไพเลอร์แบบเต็ม

ผ้าสำลีเป็นเครื่องตรวจสอบสไตล์มากกว่าและแน่นอนว่าจะไม่มีความสามารถเต็มที่

ฉันคิดว่าคุณจะพบวิธีเดียวในการตรวจสอบการรวมฟุ่มเฟือยคือการลบรวบรวมและเรียกใช้ชุด


8
สิ่งเหล่านี้จะไม่มีปัญหาหากวางไฟล์รวมไว้อย่างดี หากคุณจำเป็นต้องรวมไฟล์ A ไว้ก่อนไฟล์ B คุณจะทำผิด (และฉันได้ทำโครงการที่ทำผิดไป)
David Thornley

9
@ David ใช่ แต่ขึ้นอยู่กับปีของ devs ก่อนที่คุณจะทำอย่างถูกต้อง ผมสามารถพูดด้วยความมั่นใจว่าราคาของสิ่งที่เกิดขึ้นว่าเป็นที่โปรดปรานบ้านคุณไม่ :(
JaredPar

ใช่ แต่โดยทั่วไปฉันพบว่าเมื่อทำการแก้ไขโปรแกรมและทันใดนั้นฉันมีข้อผิดพลาดในการรวบรวม (ถ้าฉันโชคดี) หรือมีข้อผิดพลาดที่คลุมเครือ ซึ่งดูเหมือนว่าจะทำให้ไฟล์ #include ซื่อสัตย์อย่างน้อยในระยะยาว
David Thornley

ฉันจะพูดตรงกันข้าม สิ่งที่คุณต้องมีคือตัวตรวจสอบการพึ่งพาประเภท อาจไม่ได้รวบรวมหลังจากที่คุณจัดเรียงไว้แล้ว แต่สิ่งเหล่านี้เป็นปัญหาที่ควรได้รับการจัดการ
Benoît

1
@Benoit แล้วคุณจะไม่สนใจคลาสของปัญหาที่รวบรวม แต่เปลี่ยนความหมายของโปรแกรมของคุณ พิจารณาว่า #define ในไฟล์หนึ่งสามารถเปลี่ยน #if branch ในอีกไฟล์ได้อย่างไร ถอดหัวยังคงสามารถอนุญาตให้นี้จะรวบรวมกับผลที่แตกต่างกัน
JaredPar

15

ฉันคิดว่าPCLintจะทำเช่นนี้ แต่ไม่กี่ปีที่ผ่านมาตั้งแต่ฉันได้ดู คุณอาจลองดู

ฉันดูที่บล็อกนี้และผู้เขียนพูดคุยเล็กน้อยเกี่ยวกับการกำหนดค่า PCLint เพื่อค้นหาสิ่งที่ไม่ได้ใช้ อาจจะคุ้มค่าดู


หาดี! ฉันจะต้องใช้สิ่งนั้น
crashmstr

4
ฉันใช้ PCLint เป็นประจำและบอกส่วนหัวที่ไม่ได้ใช้ ฉันระมัดระวังในการแสดงความคิดเห็นออก #include หัวและรวบรวมอีกครั้งเพื่อให้แน่ใจว่าส่วนหัวไม่ได้ใช้อย่างแท้จริง ...
แฮโรลด์ Bamford

ขอบคุณสำหรับการยืนยันแฮโรลด์
itsmatt

5
แพงเกินไป. ไม่ใช่เครื่องมือที่ทำงานได้สำหรับคนทั่วไป

7

CScoutเบราว์เซอร์ refactoring สามารถตรวจสอบฟุ่มเฟือยรวมถึงแนวทางใน C (น่าเสียดายที่ไม่ C ++) รหัส คุณสามารถค้นหารายละเอียดของวิธีการทำงานในนี้บทความวารสาร


5

คุณสามารถเขียนสคริปต์ด่วนที่จะลบคำสั่ง #include เดียวคอมไพล์โปรเจ็กต์และบันทึกชื่อใน #include และไฟล์ที่ถูกลบออกจากในกรณีที่ไม่มีข้อผิดพลาดในการรวบรวมเกิดขึ้น

ปล่อยให้มันรันในตอนกลางคืนและในวันถัดไปคุณจะมีรายการรวม 100 ไฟล์ที่ถูกต้องซึ่งคุณสามารถลบได้

บางครั้งกำลังดุร้ายก็ใช้งานได้ :-)


แก้ไข:และบางครั้งก็ไม่ :-) นี่เป็นข้อมูลเล็กน้อยจากความคิดเห็น:

  1. บางครั้งคุณสามารถลบไฟล์ส่วนหัวสองไฟล์แยกกัน แต่ไม่ใช่ทั้งสองอย่างพร้อมกัน ทางออกคือการลบไฟล์ส่วนหัวในระหว่างการทำงานและไม่นำพวกเขากลับมา นี่จะค้นหารายการไฟล์ที่คุณสามารถลบได้อย่างปลอดภัยแม้ว่าอาจมีวิธีแก้ไขที่มีไฟล์จำนวนมากที่จะลบซึ่งอัลกอริทึมนี้จะไม่พบ (เป็นการค้นหาโลภในพื้นที่รวมไฟล์ที่จะลบซึ่งจะค้นหาได้สูงสุดในเครื่องเท่านั้น)
  2. อาจมีการเปลี่ยนแปลงเล็กน้อยในพฤติกรรมหากคุณมีมาโครบางตัวที่นิยามใหม่แตกต่างกันไปขึ้นอยู่กับ #ifdef บางตัว ฉันคิดว่าสิ่งเหล่านี้เป็นกรณีที่หายากมากและการทดสอบหน่วยซึ่งเป็นส่วนหนึ่งของโครงสร้างควรเป็นไปตามการเปลี่ยนแปลงเหล่านี้

1
ระวังสิ่งนี้ - บอกว่ามีไฟล์ส่วนหัวสองไฟล์ซึ่งทั้งสองมีคำจำกัดความของบางสิ่ง คุณสามารถลบได้ แต่ไม่ใช่ทั้งสองอย่าง คุณจะต้องมีรายละเอียดเพิ่มเติมเล็กน้อยในแนวทางการใช้กำลังดุร้ายของคุณ
Dominic Rodger

บางทีนี่อาจเป็นสิ่งที่คุณหมายถึง แต่สคริปต์ที่ลบการรวมครั้งเดียวออกจากการรวมการลบล่าสุดออกหากการลบออกสำเร็จจะเป็นการหลอกลวง
Dominic Rodger

1
ความคิดที่ไม่ดี หากไฟล์ส่วนหัว # กำหนด BLAH คงที่และไฟล์ส่วนหัวอื่นจะตรวจสอบ #ifdef BLAH การลบไฟล์ส่วนหัวแรกอาจยังคงรวบรวมได้สำเร็จ แต่พฤติกรรมของคุณเปลี่ยนไป
แกรมเพอร์โรว์

1
สิ่งนี้อาจทำให้เกิดปัญหากับส่วนหัวของระบบเนื่องจากการใช้งานที่แตกต่างกันอาจมีสิ่งต่าง ๆ รวมอยู่ใน #include <vector> แม้ว่าคุณจะติดกับคอมไพเลอร์ตัวเดียวส่วนหัวก็สามารถเปลี่ยนได้หลายเวอร์ชั่น
David Thornley

2
กรณีนี้จะไม่พบกรณีที่คุณรวมส่วนหัวที่มีส่วนหัวที่คุณต้องการจริงๆ
bk1e

5

ขออภัยที่ (อีกครั้ง) โพสต์ที่นี่คนมักจะไม่ขยายความคิดเห็น

ตรวจสอบความคิดเห็นของฉันเพื่อ crashmstr, FlexeLint / PC-Lint จะทำเพื่อคุณ ข้อความแสดงข้อมูล 766 ส่วน 11.8.1 ของคู่มือของฉัน (เวอร์ชัน 8.0) กล่าวถึงเรื่องนี้

นอกจากนี้และนี่เป็นสิ่งที่สำคัญให้ iterating จนกว่าจะมีข้อความออกไป กล่าวอีกนัยหนึ่งหลังจากลบส่วนหัวที่ไม่ได้ใช้ให้เรียกใช้ขุยใหม่ไฟล์ส่วนหัวอื่น ๆ อาจกลายเป็น "ไม่จำเป็น" เมื่อคุณลบส่วนหัวที่ไม่ต้องการออก (นั่นอาจฟังดูตลกอ่านช้าๆและแยกวิเคราะห์มันสมเหตุสมผล)


ฉันรู้ว่าคุณหมายถึงอะไรและปฏิกิริยาของฉันคือ "Ewwww" ฉันเกลียดรหัสเช่นนั้น
David Thornley

5

ฉันไม่เคยพบเครื่องมือที่สมบูรณ์แบบที่จะบรรลุสิ่งที่คุณต้องการ สิ่งที่ฉันใช้มากที่สุดคือIncludeManagerซึ่งทำกราฟแผนภูมิการรวมส่วนหัวของคุณเพื่อให้คุณสามารถมองเห็นสิ่งต่าง ๆ เช่นส่วนหัวที่รวมอยู่ในไฟล์เดียวและการรวมส่วนหัวแบบวงกลม


4

ฉันลองใช้ Flexelint (PC-Lint เวอร์ชั่น unix) และได้ผลลัพธ์ที่ค่อนข้างหลากหลาย อาจเป็นเพราะฉันกำลังทำงานบนฐานรหัสที่มีขนาดใหญ่และมีปมมาก ฉันขอแนะนำให้ตรวจสอบแต่ละไฟล์ที่รายงานว่าไม่ได้ใช้อย่างระมัดระวัง

ความกังวลหลักคือผลบวกผิด ๆ การรวมหลายส่วนของส่วนหัวเดียวกันถูกรายงานว่าเป็นส่วนหัวที่ไม่จำเป็น สิ่งนี้ไม่ดีเนื่องจาก Flexelint ไม่ได้บอกคุณว่าส่วนหัวของบรรทัดนั้นรวมอยู่ที่ใดหรือรวมอยู่ที่ไหนก่อน

หนึ่งในวิธีที่เครื่องมืออัตโนมัติอาจผิด:

ใน A.hpp:

class A { 
  // ...
};

ใน B.hpp:

#include "A.hpp

class B {
    public:
        A foo;
};

ใน C.cpp:

#include "C.hpp"  

#include "B.hpp"  // <-- Unneeded, but lint reports it as needed
#include "A.hpp"  // <-- Needed, but lint reports it as unneeded

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

ฉันขอแนะนำบทความเกี่ยวกับโครงสร้างทางกายภาพและ C ++จากบล็อกเกมจากภายใน พวกเขาแนะนำวิธีการที่ครอบคลุมในการทำความสะอาด #include:

แนวทาง

นี่คือชุดแนวทางที่กลั่นจากหนังสือของ Lakos ที่ลดจำนวนการพึ่งพาทางกายภาพระหว่างไฟล์ต่างๆ ฉันใช้มันมาหลายปีแล้วและฉันก็มีความสุขกับผลลัพธ์ที่ได้เสมอ

  1. ไฟล์ cpp ทุกไฟล์จะมีไฟล์ส่วนหัวของตัวเองก่อน [snip]
  2. ไฟล์ส่วนหัวจะต้องมีไฟล์ส่วนหัวทั้งหมดที่จำเป็นในการแยกมัน [snip]
  3. ไฟล์ส่วนหัวควรมีจำนวนไฟล์ขั้นต่ำเปล่าที่จำเป็นในการแยกวิเคราะห์ [snip]

หนังสือของ Lakos นั้นยอดเยี่ยมสำหรับการศึกษา - นอกเหนือจากการสังเกตที่ล้าสมัยของเขาในเทคโนโลยีคอมไพเลอร์
Tom

4

หากคุณใช้ Eclipse CDT คุณสามารถลองhttp://includator.comซึ่งฟรีสำหรับผู้ทดสอบเบต้า (ในขณะที่เขียนนี้) และลบ #includes ที่ไม่จำเป็นออกโดยอัตโนมัติหรือเพิ่มสิ่งที่ขาดหายไป สำหรับผู้ใช้ที่มี FlexeLint หรือ PC-Lint และใช้ Elicpse CDT, http://linticator.comอาจเป็นตัวเลือก (ฟรีสำหรับการทดสอบเบต้า) แม้ว่ามันจะใช้การวิเคราะห์ของ Lint แต่ก็มีการแก้ไขอย่างรวดเร็วเพื่อลบคำสั่ง #include ที่ไม่จำเป็นออกโดยอัตโนมัติ


สาเหตุที่แผนกบัญชีของเราไม่สามารถออกใบแจ้งหนี้จำนวนที่น้อยลง หากคุณนับเวลาคุณอาจประหยัดได้ไม่ใช่ว่าไม่มีเหตุผล ครั้งหนึ่งเรามีความสามารถในการรับชำระเงินด้วยบัตรเครดิตเราสามารถลดราคาลงอย่างมาก ตัวเลือกอื่นจะเป็นผู้สนับสนุนสำหรับความพยายามในการพัฒนาของเรา รูปแบบการจัดหาเงินทุนของเรากำหนดให้เราต้องได้รับผลกำไรเพื่อสนับสนุนงานวิจัยของเรา ฉันยินดีที่จะขายใบอนุญาตที่ถูกกว่ามาก แต่ทำไม่ได้ อาจเป็นเพราะเราจะร่วมให้ข้อมูลกับ CDT และคุณได้รับฟรี แต่ฉันต้องใช้เงินทุนอย่างใด ฉันลืมคุณสามารถลองได้ฟรี!
PeterSom

2

บทความนี้อธิบายเทคนิคการ #include เอาโดยใช้การแยกวิเคราะห์ของ Doxygen นั่นเป็นเพียงสคริปต์ Perl ดังนั้นจึงค่อนข้างใช้งานง่าย


1
สคริปต์พบว่ามีบางอันที่จะลบ แต่มันก็มีหลายอย่างที่ไม่สามารถลบออกได้ ดูเหมือนว่าจะไม่รองรับคลาส enum ดูเหมือนว่าจะมีช่วงเวลาที่แย่กับแมโครและบางครั้งก็มีเนมสเปซ
Baptiste Wicht

1

อาจจะสายไปหน่อย แต่ฉันเคยพบสคริปต์ของ WebKit ที่ทำในสิ่งที่คุณต้องการ มันจะต้องมีการปรับตัวบางอย่างที่ฉันเชื่อว่า (ฉันไม่รอบรู้ใน perl) แต่ควรทำเคล็ดลับ:

http://trac.webkit.org/browser/branches/old/safari-3-2-branch/WebKitTools/Scripts/find-extra-includes

(นี่เป็นสาขาเก่าเพราะลำต้นไม่มีไฟล์อีกต่อไป)



1

มีไฟล์ #include ที่ฟุ่มเฟือยสองประเภท:

  1. ไฟล์ส่วนหัวไม่จำเป็นจริง ๆ โดยโมดูล (.c, .cpp) เลย
  2. โมดูลส่วนหัวต้องการโมดูล แต่มีการรวมมากกว่าหนึ่งครั้งไม่ว่าโดยตรงหรือโดยอ้อม

ประสบการณ์ของฉันมีสองวิธีที่ใช้งานได้ดีในการตรวจจับ:

  • gcc -H หรือ cl.exe / showincludes (แก้ไขปัญหาที่ 2)

    ในโลกแห่งความจริงคุณสามารถส่งออก CFLAGS = -H ก่อนที่จะทำการถ้าตัวเลือก Makefile ไม่ได้แทนที่ตัวเลือก CFLAGS หรืออย่างที่ฉันเคยใช้คุณสามารถสร้างกระดาษห่อหุ้ม cc / g ++ เพื่อเพิ่มตัวเลือก -H บังคับให้เรียกใช้แต่ละ $ (CC) และ $ (CXX) และเพิ่มไดเรกทอรีของ wrapper ไปที่ตัวแปร $ PATH จากนั้น make ทั้งหมดของคุณจะใช้คำสั่ง wrapper แทน แน่นอน wrapper ของคุณควรเรียกใช้คอมไพเลอร์ gcc จริง เทคนิคนี้จำเป็นต้องเปลี่ยนหาก Makefile ของคุณใช้ gcc โดยตรง แทน $ (CC) หรือ $ (CXX) หรือตามกฎโดยนัย

    นอกจากนี้คุณยังสามารถรวบรวมไฟล์เดียวโดยปรับแต่งด้วยบรรทัดคำสั่ง แต่ถ้าคุณต้องการทำความสะอาดส่วนหัวสำหรับโครงการทั้งหมด คุณสามารถจับภาพเอาต์พุตทั้งหมดโดย:

    ทำความสะอาด

    ทำ 2> & 1 | ทีผลลัพธ์. txt

  • PC-Lint / FlexeLint (แก้ไขปัญหาทั้ง 1 และ 2)

    ตรวจสอบให้แน่ใจว่าเพิ่มตัวเลือก + e766 คำเตือนนี้เกี่ยวกับ: ไฟล์ส่วนหัวที่ไม่ได้ใช้

    pclint / หิน -vf ...

    สิ่งนี้จะทำให้ pclint เอาต์พุตรวมไฟล์ส่วนหัวไฟล์ส่วนหัวที่ซ้อนกันจะถูกเยื้องอย่างเหมาะสม


1

หากต้องการสิ้นสุดการสนทนานี้: ตัวประมวลผลล่วงหน้า c ++ กำลังทำให้สมบูรณ์ มันเป็นคุณสมบัติความหมายไม่ว่าจะรวมถึงฟุ่มเฟือย ดังนั้นจึงเป็นไปตามทฤษฎีบทของไรซ์ว่าไม่สามารถบอกได้ว่าการรวมกันนั้นไม่จำเป็นหรือไม่ ไม่สามารถเป็นโปรแกรมได้ (ตรวจสอบว่าถูกต้องเสมอ) รวมอยู่หรือไม่


5
ฉันขอโซลูชันที่ "ถูกต้องเสมอ" หรือไม่? คำตอบนี้ไม่ได้ผลมากสำหรับการอภิปราย
shoosh

1
มีการโพสต์มากมายพูดคุยเกี่ยวกับปัญหาที่โปรแกรมดังกล่าวจะต้องจัดการกับ โพสต์ของฉันให้คำตอบที่สรุปและถูกต้องในส่วนของการสนทนา และฉันก็คงไม่ชอบถ้าโปรแกรมบอกฉันฉันสามารถลบ #include ได้อย่างปลอดภัยแล้วรหัสของฉันก็ไม่ได้รวบรวมอีกต่อไป (หรือแย่กว่านั้น - ยังคงรวบรวม แต่ทำสิ่งที่แตกต่าง) โปรแกรมดังกล่าวใด ๆ ที่มีความเสี่ยงนี้
Algoman

4
ระหว่างการเก็งกำไรทั้งหมดเกี่ยวกับความยากลำบากที่จะเกิดขึ้นและวิธีที่คุณอาจแก้ไขสิ่งกีดขวางอย่างใดอย่างหนึ่งฉันได้ให้คำตอบที่ถูกต้องเพียง 100% เท่านั้น ฉันคิดว่ามันค่อนข้างทะลึ่งจะพูดว่านี่คือไม่ได้ผลิต ...
Algoman

1
ฉันจำได้ว่าทฤษฎีบทของไรซ์กล่าวว่า "ไม่มีโปรแกรมที่สามารถตรวจสอบได้เสมอว่าโปรแกรมใดโปรแกรมหนึ่งแก้ปัญหาฟุ่มเฟือยรวมถึงปัญหานี้ได้หรือไม่" อาจมีบางโปรแกรมที่แก้ปัญหาฟุ่มเฟือยรวมถึง
Zhe Yang

1
ส่วนตัวฉันพบว่าอินพุตของ @ Algoman มีประโยชน์มาก ทำให้ฉันรู้ว่าปัญหานี้หนักแค่ไหน
โบการ์ดอน

1

นี่คือการที่ง่ายวิธีการระบุส่วนหัวของฟุ่มเฟือยรวมถึงแรงเดรัจฉาน มันไม่สมบูรณ์แบบ แต่กำจัดสิ่งที่ไม่จำเป็น "ชัดเจน" ออกไป การกำจัดสิ่งเหล่านี้ไปไกลในการทำความสะอาดรหัส

สคริปต์สามารถเข้าถึงได้โดยตรงบน GitHub


0

PC Lintของ Gimpel Software สามารถรายงานเมื่อไฟล์รวมถูกรวมไว้มากกว่าหนึ่งครั้งในคอมไพล์ยูนิตแต่ไม่สามารถหาไฟล์ include ซึ่งไม่จำเป็นในแบบที่คุณต้องการ

แก้ไข:มันสามารถ ดูคำตอบของมันแมตต์


คุณแน่ใจเหรอ ฉันไม่ได้ใช้ FlexeLint (เหมือนกับ PCL) ในสองสามปีกับรหัส C ++ แต่เมื่อเร็ว ๆ นี้กับรหัส C ฉันสามารถสาบานได้ว่าฉันเห็นข้อความสองสามข้อความ (ฉันคิดว่ามันเป็นรหัส 766?) เกี่ยวกับไฟล์ส่วนหัวที่ไม่ได้ใช้ เพิ่งตรวจสอบ (v8.0) ดูหัวข้อ 11.8.1 ของคู่มือ
ด่าน

0

CLion , C / C ++ IDE จาก JetBrains ตรวจจับสิ่งที่ซ้ำซ้อนรวมถึงสิ่งที่ไม่ควรทำ เหล่านี้เป็นสีเทาออกในการแก้ไข แต่ยังมีฟังก์ชั่นเพื่อเพิ่มประสิทธิภาพรวมถึงในแฟ้มปัจจุบันหรือโครงการทั้งหมด

ฉันพบว่าคุณจ่ายสำหรับฟังก์ชั่นนี้ แต่; CLion ใช้เวลาสักครู่ในการสแกนและวิเคราะห์โครงการของคุณเมื่อโหลดครั้งแรก

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