* .h หรือ * .hpp สำหรับนิยามคลาสของคุณ


554

ผมเคยใช้เสมอ*.hไฟล์สำหรับคำจำกัดความชั้นเรียนของฉัน *.hppแต่หลังจากที่ได้อ่านรหัสห้องสมุดเพิ่มบางอย่างผมตระหนักว่าพวกเขาใช้งานทั้งหมด ฉันมักจะไม่ชอบนามสกุลไฟล์นั้นฉันคิดว่าส่วนใหญ่เป็นเพราะฉันไม่ชิน

อะไรคือข้อดีและข้อเสียของการใช้*.hppมากกว่า*.h?

คำตอบ:


528

ต่อไปนี้เป็นเหตุผลสองสามข้อในการตั้งชื่อส่วนหัว C vs C ++ ที่แตกต่างกัน:

  • การจัดรูปแบบโค้ดอัตโนมัติคุณอาจมีแนวทางแตกต่างกันสำหรับการจัดรูปแบบรหัส C และ C ++ หากส่วนหัวถูกคั่นด้วยส่วนขยายคุณสามารถตั้งค่าตัวแก้ไขให้ใช้การจัดรูปแบบที่เหมาะสมโดยอัตโนมัติ
  • การตั้งชื่อฉันอยู่ในโครงการที่มีห้องสมุดที่เขียนใน C และจากนั้น wrappers ถูกนำไปใช้ใน C ++ เนื่องจากส่วนหัวมักจะมีชื่อที่คล้ายกันเช่น Feature.h vs Feature.hpp จึงง่ายต่อการแยกออกจากกัน
  • การรวมโครงการของคุณอาจมีรุ่นที่เหมาะสมกว่าที่เขียนใน C ++ แต่คุณใช้เวอร์ชัน C (ดูที่จุดด้านบน) หากส่วนหัวได้รับการตั้งชื่อตามภาษาที่ใช้ในนั้นคุณสามารถมองเห็นส่วนหัว C ทั้งหมดและตรวจสอบเวอร์ชัน C ++ ได้อย่างง่ายดาย

โปรดจำไว้ว่า C ไม่ใช่ C ++ และมันอาจเป็นอันตรายอย่างมากในการผสมผสานและจับคู่เว้นแต่ว่าคุณรู้ว่าคุณกำลังทำอะไรอยู่ การตั้งชื่อแหล่งที่มาของคุณอย่างเหมาะสมจะช่วยให้คุณแยกแยะภาษาต่าง ๆ ได้


234

ฉันใช้. hpp เพราะฉันต้องการให้ผู้ใช้แยกความแตกต่างว่าส่วนหัวคือส่วนหัวของ C ++ และส่วนหัวใดที่เป็นส่วนหัวของ C

สิ่งนี้อาจมีความสำคัญเมื่อโครงการของคุณใช้ทั้งโมดูล C และ C ++: เช่นเดียวกับคนอื่นที่อธิบายมาก่อนฉันคุณควรทำอย่างระมัดระวังและเริ่มด้วย "สัญญา" ที่คุณเสนอผ่านส่วนขยาย

.hpp: ส่วนหัว C ++

(หรือ. hxx หรือ. hh หรืออะไรก็ตาม)

ส่วนหัวนี้ใช้สำหรับ C ++ เท่านั้น

หากคุณอยู่ในโมดูล C อย่าพยายามรวมเข้าไปด้วย คุณจะไม่ชอบเพราะไม่มีความพยายามที่จะทำให้มันเป็นมิตรกับ C (มากเกินไปจะหายไปเช่นการทำงานมากเกินไปเนมสเปซ ฯลฯ )

.h: C / C ++ หรือส่วนหัว C บริสุทธิ์

ส่วนหัวนี้สามารถรวมโดยทั้งแหล่ง C และแหล่ง C ++ โดยตรงหรือโดยอ้อม

มันสามารถรวมโดยตรงได้รับการคุ้มครองโดย__cplusplusแมโคร:

  • ซึ่งหมายความว่าจาก C ++ มุมมองรหัส extern "C"C-เข้ากันได้จะได้รับการกำหนดให้เป็น
  • จากมุมมอง C รหัส C ทั้งหมดจะปรากฏชัดแจ้ง แต่รหัส C ++ จะถูกซ่อน (เพราะจะไม่รวบรวมในตัวแปลภาษา C)

ตัวอย่างเช่น:

#ifndef MY_HEADER_H
#define MY_HEADER_H

   #ifdef __cplusplus
      extern "C"
      {
   #endif

   void myCFunction() ;

   #ifdef __cplusplus
      } // extern "C"
   #endif

#endif // MY_HEADER_H

หรืออาจถูกรวมทางอ้อมโดยส่วนหัว. hpp ที่สอดคล้องกันซึ่งล้อมรอบด้วยการextern "C"ประกาศ

ตัวอย่างเช่น:

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP

extern "C"
{
#include "my_header.h"
}

#endif // MY_HEADER_HPP

และ:

#ifndef MY_HEADER_H
#define MY_HEADER_H

void myCFunction() ;

#endif // MY_HEADER_H

3
สิ่งนี้ค่อนข้างไม่คุ้นเคยในหลายโครงการ C ++ ไฟล์. h ถูกใช้สำหรับสิ่งของที่ไม่ได้จัดทำ
einpoklum

4
@ einpoklum: แน่นอน แต่ฉันพยายามหลีกเลี่ยงพฤติกรรม "Monkey See Monkey Do" ในกรณีปัจจุบันมีทั้งส่วนขยาย (และส่วนอื่น ๆ ) ดังนั้นฉันจึงพยายามทำให้ส่วนขยายนั้นเป็นจริง การมีสัญญานี้พร้อมรหัสที่ใช้ร่วมกับลูกค้านั้นมีประโยชน์มาก: ทุกคน (เช่นนักพัฒนาหลายร้อยคน) รู้ว่าไฟล์ ".H" นั้นจะต้องถูกใช้โดยไคลเอนต์ที่ใช้คอมไพเลอร์ C ดังนั้นจึงไม่ผิดที่จะไปที่นั่นหรือ ไม่. และทุกคน (รวมถึงไคลเอนต์) รู้ว่าไฟล์ ".HPP" จะไม่พยายามเป็นมิตรกับ C ทุกคนชนะ
paercebal

4
@ paercebalดังนั้นคุณกำลังแนะนำ. Hแทน. hและ. HPPมากกว่า. hpp ?
Geof Sawaya

6
@GeofSawaya: ไม่ขอโทษ มันเป็นนิสัย เมื่อเขียนบทความฉันใช้ส่วนขยายเป็นตัวพิมพ์ใหญ่เพื่อแยกไฟล์ตามประเภทเช่น ".HPP files" แต่ส่วนขยายของไฟล์จริงที่อยู่บนฮาร์ดดิสก์ของฉันจะเป็นตัวพิมพ์เล็กเสมอแม้ในชื่อจะไม่เหมือน "MyClass.hpp" หรือ "module.hpp"
paercebal

4
ขอบคุณ @ paercebal ฉันกำลังคุยอวด
Geof Sawaya

48

ฉันมักจะคิดว่า.hppส่วนหัวเป็นประเภทของกระเป๋าหิ้ว.hและ.cppไฟล์ ... ส่วนหัวที่มีรายละเอียดการใช้งานเช่นกัน

โดยทั่วไปเมื่อฉันเห็น (และใช้) .hppเป็นส่วนขยายไม่มี.cppไฟล์ที่เกี่ยวข้อง อย่างที่คนอื่นพูดมานี่ไม่ใช่กฎที่แข็งและเร็วแค่วิธีที่ฉันมักจะใช้.hppไฟล์


31

ไม่สำคัญว่าคุณใช้ส่วนขยายใด อย่างใดอย่างหนึ่งก็โอเค

ฉันใช้*.hสำหรับ C และ*.hppC ++


23

แก้ไข [เพิ่มข้อเสนอแนะจาก Dan Nissenbaum]:

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

เทมเพลตไลบรารีบางตัวที่เป็นไปตามอนุสัญญานี้จะให้ส่วนหัวที่มีนามสกุล. hpp เพื่อระบุว่าไม่มีไฟล์. cpp ที่เกี่ยวข้อง

การประชุมอื่นคือการใช้. h สำหรับส่วนหัว C และ. hpp สำหรับ C ++; ตัวอย่างที่ดีคือห้องสมุดเพิ่ม

อ้างจาก Boost คำถามที่พบบ่อย

นามสกุลไฟล์สื่อสารประเภท "" ของไฟล์ทั้งกับมนุษย์และโปรแกรมคอมพิวเตอร์ ส่วนขยาย '.h' ใช้สำหรับไฟล์ส่วนหัว C และสื่อสารสิ่งผิดปกติเกี่ยวกับไฟล์ส่วนหัว C ++ การใช้ส่วนขยายไม่มีการสื่อสารอะไรและบังคับให้ตรวจสอบเนื้อหาไฟล์เพื่อกำหนดประเภท การใช้ '.hpp' จะระบุอย่างชัดเจนว่าเป็นไฟล์ส่วนหัว C ++ และทำงานได้ดีในการปฏิบัติจริง (Rainer Deyke)


ไม่มีสิ่งใดที่เป็นจริงมันไม่สร้างความแตกต่างไม่ว่าไฟล์จะเป็น. h หรือ. hpp เมื่อมันมาถึงการสร้างรหัสหรือการเชื่อมโยง
ทำเครื่องหมายอินแกรม

มันไม่ใช่แค่เรื่องของการประชุม? ไลบรารี C ++ std ให้ส่วนหัวทั้งหมดโดยไม่มีส่วนขยายใด ๆ ใช้ ".hpp" เพียงระบุว่ามีการกำหนดต้นแบบในไฟล์เดียวกันและจะไม่มีไฟล์. cpp ที่เกี่ยวข้อง
ProgramCpp

5
ฉันคิดว่าคำตอบนี้มีประโยชน์ยกเว้นว่ามันไม่มีวลีที่เรียบง่าย แต่สำคัญ: "โดยการประชุมไม่ใช่ตามกฎของภาษา" (บางแห่ง)
Dan Nissenbaum

13

ฉันเพิ่งเริ่มใช้ *.hppกับส่วนหัว c ++

เหตุผลคือฉันใช้ emacs เป็นตัวแก้ไขหลักและเข้าสู่โหมด c โดยอัตโนมัติเมื่อคุณโหลด*.hไฟล์และเข้าสู่โหมด c ++ เมื่อคุณโหลด*.hppไฟล์

นอกจากความจริงที่ว่าผมไม่เห็นเหตุผลที่ดีในการเลือก*.hมากกว่า*.hppหรือในทางกลับกัน


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

12

ฉันกำลังตอบคำถามนี้เป็นเครื่องเตือนความจำเพื่อให้ความเห็นเกี่ยวกับ "ผู้ใช้ 1949346" ให้คำตอบสำหรับ OP เดียวกันนี้


ดังนั้นหลายคนตอบแล้ว: วิธีใดก็แล้วแต่ ตามมาด้วยการเน้นความประทับใจของตัวเอง

เกริ่นนำเช่นเดียวกับในความคิดเห็นที่มีชื่อก่อนหน้านี้ระบุไว้ความคิดเห็นของฉันคือC++ส่วนขยายส่วนหัวที่เสนอให้เป็น.hถ้าไม่มีเหตุผลใดที่ขัดแย้งกับมัน

เนื่องจากเอกสาร ISO / IEC ใช้สัญลักษณ์ของไฟล์ส่วนหัวนี้และไม่มีการจับคู่สตริงที่จะ.hppเกิดขึ้นในเอกสารเกี่ยวกับภาษาของพวกเขาC++แม้เกิดขึ้นในเอกสารภาษาของพวกเขาเกี่ยวกับ

แต่ตอนนี้ฉันตั้งเป้าหมายด้วยเหตุผลที่ยอมรับได้ทำไมทั้งสองวิธีก็โอเคและโดยเฉพาะอย่างยิ่งทำไมมันไม่ได้อยู่ในภาษาที่ตัวเองทำ

ดังนั้นเราไปกันเลย

C++เอกสาร (ฉันจริงการอ้างอิงจากรุ่น N3690) ที่กำหนดว่าส่วนหัวมีเพื่อให้สอดคล้องกับไวยากรณ์ต่อไปนี้:

2.9 ชื่อส่วนหัว

header-name:
    < h-char-sequence >
    " q-char-sequence "
h-char-sequence:
    h-char
    h-char-sequence h-char
h-char:
    any member of the source character set except new-line and >
q-char-sequence:
    q-char
    q-char-sequence q-char
q-char:
    any member of the source character set except new-line and "

ดังนั้นในขณะที่เราสามารถแยกออกจากส่วนนี้ชื่อไฟล์ส่วนหัวอาจเป็นอะไรก็ได้ที่ถูกต้องในซอร์สโค้ดเช่นกัน ยกเว้นที่มี'\n'ตัวอักษรและขึ้นอยู่กับว่ามันเป็นเรื่องที่จะถูกรวมโดยไม่ได้รับอนุญาตให้มี<> >หรือวิธีการอื่น ๆ ถ้ามันจะรวมอยู่โดย""-include "มันจะไม่ได้รับอนุญาตให้มี

ในคำอื่น ๆ : หากคุณมีสภาพแวดล้อมที่สนับสนุนชื่อไฟล์เช่นprettyStupidIdea.>รวม:

#include "prettyStupidIdea.>"

จะถูกต้อง แต่:

#include <prettyStupidIdea.>>

จะไม่ถูกต้อง วิธีอื่น ๆ รอบเดียวกัน

และแม้กระทั่ง

#include <<.<>

จะเป็นชื่อไฟล์ส่วนหัวที่ถูกต้องที่รวมได้

แม้สิ่งนี้จะสอดคล้องกับC++มันก็เป็นความคิดที่โง่เง่ามากทีเดียว

และนั่นเป็นเหตุผลที่.hppถูกต้องเช่นกัน

แต่มันไม่ใช่ผลลัพธ์ของคณะกรรมการที่ออกแบบการตัดสินใจสำหรับภาษา!

ดังนั้นการพูดคุยเกี่ยวกับการใช้งาน.hppก็เหมือนกับการทำเรื่อง.ccนั้น.mmหรืออะไรที่ฉันเคยอ่านในกระทู้อื่น ๆ ในหัวข้อนี้

ฉันต้องยอมรับว่าฉันไม่มีเงื่อนงำที่.hppมาจาก1แต่ฉันจะพนันนักประดิษฐ์เครื่องมือแยกวิเคราะห์ IDE หรืออย่างอื่นที่เกี่ยวข้องกับC++แนวคิดนี้เพื่อปรับกระบวนการภายในบางอย่างหรือเพื่อคิดค้นบางอย่าง (อาจจำเป็นสำหรับพวกเขา ) แบบแผนการตั้งชื่อใหม่

แต่มันไม่ได้เป็นส่วนหนึ่งของภาษา

และเมื่อใดก็ตามที่เราตัดสินใจที่จะใช้วิธีนี้ อาจเป็นเพราะเขาชอบมากที่สุดหรือเนื่องจากบางแอปพลิเคชันของเวิร์กโฟลว์ต้องการมันก็ไม่เคย2เป็นข้อกำหนดของภาษา ดังนั้นใครก็ตามที่บอกว่า "pp เป็นเพราะมันถูกใช้กับ C ++" ก็เป็นเรื่องผิดเกี่ยวกับการกำหนดภาษา

C ++ อนุญาตให้ทุกสิ่งที่เกี่ยวข้องกับย่อหน้าก่อนหน้า และหากมีสิ่งใดที่คณะกรรมการเสนอให้ใช้มันก็จะถูกใช้.hเพราะนี่คือส่วนขยายฟ้องในตัวอย่างทั้งหมดของเอกสาร ISO

สรุป:

ตราบใดที่คุณไม่เห็น / รู้สึกว่าจำเป็นต้องใช้.hเกิน.hppหรือคีมจับในทางกลับกันคุณไม่ควรกังวล เพราะทั้งคู่จะเป็นชื่อส่วนหัวที่ถูกต้องซึ่งมีคุณภาพเดียวกันตามมาตรฐาน ดังนั้นสิ่งใดก็ตามที่ต้องการให้คุณใช้.hหรือ.hppเป็นข้อ จำกัด เพิ่มเติมของมาตรฐานซึ่งอาจขัดแย้งกับข้อ จำกัด เพิ่มเติมอื่น ๆ ที่ไม่สอดคล้องกัน แต่เนื่องจาก OP ไม่ได้กล่าวถึงข้อ จำกัด ด้านภาษาเพิ่มเติมนี่เป็นคำตอบเดียวที่ถูกต้องและได้รับการอนุมัติสำหรับคำถาม

" * .h หรือ * .hpp สำหรับนิยามคลาสของคุณ " คือ:

ทั้งสองอย่างนั้นถูกต้องและสามารถใช้ได้ตราบใดที่ไม่มีข้อ จำกัด ภายนอก


1 จากสิ่งที่ฉันรู้ชัดว่าเป็นกรอบการทำงานที่เพิ่มขึ้นมาพร้อมกับ.hppส่วนขยายนั้น

2 แน่นอนฉันไม่สามารถบอกได้ว่าจะมีเวอร์ชั่นต่อ ๆ ไปในอนาคต!


7

ฉันชอบ. hpp สำหรับ C ++ เพื่อให้ชัดเจนทั้งตัวแก้ไขและโปรแกรมเมอร์อื่น ๆ ที่เป็นส่วนหัว C ++ แทนที่จะเป็นไฟล์ส่วนหัว C


6

C ++ ("C Plus Plus") มีความหมายเหมือนกับ. cpp

การมีไฟล์ส่วนหัวที่มีนามสกุล. hpp ไม่มีลอจิกแบบเดียวกัน


6

คุณสามารถโทรหาคุณรวมถึงสิ่งที่คุณต้องการ

เพียงแค่ต้องระบุชื่อเต็มใน #includeเพียงแค่ต้องระบุว่าชื่อเต็มรูปแบบใน

ฉันแนะนำว่าถ้าคุณทำงานกับ C เพื่อใช้.hและเมื่อใช้ C ++ ให้ใช้.hppกับการใช้งาน

มันเป็นเพียงแค่การประชุมในท้ายที่สุด


5

Codegear C ++ Builder ใช้. hpp สำหรับไฟล์ส่วนหัวที่สร้างขึ้นโดยอัตโนมัติจากไฟล์ต้นฉบับ Delphi และไฟล์. h สำหรับไฟล์ส่วนหัว "ของคุณ"

ดังนั้นเมื่อฉันเขียนไฟล์ส่วนหัว C ++ ฉันมักจะใช้. h


5

ในหนึ่งในงานของฉันในช่วงต้นทศวรรษ 90 เราใช้. cc และ. hh สำหรับไฟล์ต้นฉบับและไฟล์ส่วนหัวตามลำดับ ฉันยังชอบมากกว่าตัวเลือกทั้งหมดอาจเป็นเพราะพิมพ์ง่ายที่สุด


5

Bjarne Stroustrup และ Herb Sutter มีคำชี้แจงถึงคำถามนี้ในแนวทางหลัก C ++ ของพวกเขาที่พบใน: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-sourceซึ่งอ้างถึงการเปลี่ยนแปลงล่าสุด ในส่วนขยายมาตรฐาน (C ++ 11, C ++ 14, ฯลฯ )

SF.1: ใช้. cpp ต่อท้ายสำหรับไฟล์รหัสและ. h สำหรับไฟล์อินเทอร์เฟซหากโปรเจ็กต์ Y ของคุณยังไม่ได้ปฏิบัติตามหลักการประชุมอื่น

มันเป็นการประชุมที่ยาวนาน แต่ความสอดคล้องมีความสำคัญมากกว่าดังนั้นหากโครงการของคุณใช้อย่างอื่นให้ทำตามนั้น บันทึก

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

ไม่จำเป็นต้องใช้ชื่อเฉพาะ. h และ. cpp (แนะนำเป็นค่าเริ่มต้น) และชื่ออื่น ๆ มีการใช้งานอย่างแพร่หลาย ตัวอย่างคือ. hh, .C และ. cxx ใช้ชื่อดังกล่าวอย่างเท่าเทียมกัน ในเอกสารนี้เราอ้างถึง. h และ. cpp> เป็นชวเลขสำหรับส่วนหัวและไฟล์การใช้งานแม้ว่าส่วนขยายจริงอาจแตกต่างกัน

IDE ของคุณ (ถ้าคุณใช้) อาจมีความคิดเห็นที่ดีเกี่ยวกับพอเพียง

ฉันไม่ใช่แฟนตัวยงของการประชุมนี้เพราะถ้าคุณใช้ห้องสมุดยอดนิยมอย่างบูสต์ความมั่นคงของคุณก็พังแล้วและคุณควรใช้. hpp


4

เป็นจำนวนมากที่นี่ได้กล่าวถึงแล้วฉันยังต้องการใช้. hpp สำหรับไลบรารีส่วนหัวเท่านั้นที่ใช้แม่แบบชั้นเรียน / ฟังก์ชั่น ฉันชอบที่จะใช้. h สำหรับไฟล์ส่วนหัวที่มาพร้อมกับไฟล์ต้นฉบับ. cpp หรือไลบรารีแบบแบ่งใช้หรือแบบคงที่

ไลบรารี่ส่วนใหญ่ที่ฉันพัฒนานั้นเป็นเทมเพลตและจำเป็นต้องมีเฉพาะส่วนหัวเท่านั้น แต่เมื่อเขียนแอปพลิเคชันฉันมักจะแยกการประกาศจากการอิมพลีเมนต์และจบด้วยไฟล์. h และ. cpp


3

โชคดีที่มันง่าย

คุณควรใช้ส่วนขยาย. hpp ถ้าคุณทำงานกับ C ++ และคุณควรใช้. h สำหรับ C หรือผสม C และ C ++


2

ฉันใช้. h เพราะนั่นคือสิ่งที่ Microsoft ใช้และสิ่งที่ตัวสร้างรหัสสร้างขึ้น ไม่จำเป็นต้องไปขัดกับเมล็ดข้าว


ไม่ทุกที่ในตัวอย่างจำนวนมาก (เช่น WINDDK) พวกเขาใช้. hpp
มาร์ช

13
ฉันจะไม่เรียก Microsoft 'เมล็ดพืช' เมื่อมาถึง C ++
developerbmw

@ เบร็ทมันคือเมื่อมันเป็นงานของคุณ และแม้ว่าจะไม่ใช่มันก็เป็นคอมไพเลอร์ยอดนิยมที่น่ากลัว
Mark Ransom

@ MarkRansom ฉันอ้างถึงประวัติของ Microsoft ในการใช้ C. IMO VC ++ เป็นคอมไพเลอร์ที่ยอดเยี่ยม
developerbmw

1
@developerbmw ฉันจะบอกว่า MSVC เป็นเกรนสำหรับโปรแกรม Windows และ GCC เป็นเกรนสำหรับโปรแกรม * nix โดยส่วนตัว พวกเขาเป็นคอมไพเลอร์อื่น ๆ ส่วนใหญ่สำหรับแพลตฟอร์มเหล่านั้นมักจะพยายามที่จะเข้ากันได้กับความรู้ของฉัน
Justin Time - Reinstate Monica

1

ใน "ภาษาการเขียนโปรแกรม C ++ รุ่นที่สามโดย Bjarne Stroustrup" หนังสือ C ++ ที่ต้องอ่านnº1เขาใช้ * .h ดังนั้นฉันคิดว่าวิธีที่ดีที่สุดคือใช้ * .h

อย่างไรก็ตาม * .hpp ก็ใช้ได้เช่นกัน!


1
หากบางคนเขียนหนังสือเกี่ยวกับสิ่งที่เขาเรียนรู้จากคนอื่นที่เรียนรู้จากหนังสือเล่มอื่น (อาจจะโชคดีเหมือนกัน) เขียนโดยคนที่อาจมีแหล่งข้อมูลเบื้องต้นอยู่นั่นคือสิ่งที่พวกเขาทำอะไร แต่ไม่ใช่เครื่องหมายสำหรับ ปฏิบัติที่ดีที่สุด
dhein

เพียงพูดถึง: ฉันจริงลงคะแนนนี้ แต่ฉันจะได้ upvoting มันถ้ามันบอกว่า "ISO / IEC N3690" หรืออื่น ๆ ของ C ++ ฉบับร่างไม่ใช่ "ภาษาการเขียนโปรแกรม C ++ รุ่นที่สามโดย Bjarne Stroustrup" ในขณะนี้จะเป็นจุดที่ถูกต้องเนื่องจากไม่มีการพูดถึง.hppภาษาเองเลย
เดเฮน

9
@zaibis คุณรู้ไหมว่า Bjarne Stroustrup เป็นผู้คิดค้น C ++ ใช่ไหม?
tumtumtum

@tumtumtum: ยอมรับแล้วฉันไม่รู้ตัวเลย แต่อย่างไรก็ตามในกรณีนั้นมันยังคงเป็นเอกสารของคณะอนุกรรมการรักษามาตรฐานซึ่งเป็นสิ่งที่ต้องทำ แม้ว่าเขาจะเป็นผู้ประดิษฐ์ภาษา แต่มันก็ไม่ใช่การตัดสินใจของเขาอีกต่อไป ดังนั้นแม้ว่าสิ่งนี้จะทำให้คำตอบนี้น่าเชื่อถือมากขึ้น แต่ก็ยังไม่ใช่เหตุผลที่ถูกต้อง
เดเฮน

1

มันเป็นเรื่องง่ายสำหรับเครื่องมือและมนุษย์ที่แตกต่างบางสิ่งบางอย่าง แค่นั้นแหละ.

ในการใช้งานทั่วไป (โดยการเพิ่มประสิทธิภาพ ฯลฯ ) .hppเป็นส่วนหัว C ++ โดยเฉพาะ ในทางกลับกัน,.hเป็นสำหรับ non-C ++ - เฉพาะส่วนหัว (ส่วนใหญ่ C) ในการตรวจสอบอย่างแม่นยำภาษาของเนื้อหานั้นมักจะยากเนื่องจากมีหลายกรณีที่ไม่สำคัญดังนั้นความแตกต่างนี้มักทำให้เครื่องมือที่พร้อมใช้งานง่ายต่อการเขียน สำหรับมนุษย์เมื่อได้รับการประชุมมันก็ง่ายต่อการจดจำและใช้งานง่าย

อย่างไรก็ตามฉันชี้ให้เห็นว่าการประชุมนั้นไม่ได้ผลตามที่คาดหวังเสมอไป

  • มันไม่ได้ถูกบังคับโดยสเปคของภาษาทั้ง C หรือ C ++ มีหลายโครงการที่ไม่ปฏิบัติตามอนุสัญญา เมื่อคุณต้องการผสาน (เพื่อผสม) สิ่งเหล่านี้อาจเป็นปัญหาได้
  • .hppตัวเองไม่ได้เป็นทางเลือกเดียว ทำไมจะไม่ล่ะ.hhหรือ.hxx? (แม้ว่าคุณจะต้องมีกฎดั้งเดิมอย่างน้อยหนึ่งข้อเกี่ยวกับชื่อไฟล์และเส้นทาง)

ฉันเองใช้ทั้ง.hและ.hppในโครงการ C ++ ฉันไม่ปฏิบัติตามอนุสัญญาข้างต้นเพราะ:

  • ภาษาที่ใช้โดยแต่ละส่วนของโครงการมีการบันทึกไว้อย่างชัดเจน ไม่มีโอกาสที่จะผสม C และ C ++ ในโมดูลเดียวกัน (ไดเรกทอรี) ทุก ๆ ห้องสมุดของบุคคลที่สามจะต้องปฏิบัติตามกฎนี้
  • ข้อมูลจำเพาะภาษาที่สอดคล้องและภาษาถิ่นที่ได้รับอนุญาตที่ใช้โดยโครงการจะได้รับการบันทึกไว้ (อันที่จริงแล้วฉันยังบันทึกเอกสารแหล่งที่มาของคุณสมบัติมาตรฐานและการแก้ไขข้อบกพร่อง (ในมาตรฐานภาษา) ที่ใช้ ) สิ่งนี้ค่อนข้างสำคัญกว่าการแยกแยะภาษาที่ใช้เนื่องจากมีข้อผิดพลาดง่ายเกินไปและค่าใช้จ่ายในการทดสอบ (เช่น คอมไพเลอร์เข้ากันได้) อาจมีความสำคัญ (ซับซ้อนและใช้เวลานาน) โดยเฉพาะอย่างยิ่งในโครงการที่มีอยู่แล้วในC ++ บริสุทธิ์เกือบทั้งหมด ชื่อไฟล์อ่อนแอเกินไปที่จะจัดการกับสิ่งนี้
  • แม้สำหรับภาษา C ++ เดียวกันอาจมีคุณสมบัติที่สำคัญกว่าที่เหมาะสมกับความแตกต่าง ตัวอย่างเช่นดูการประชุมด้านล่าง
  • ชื่อไฟล์นั้นเป็นส่วนหนึ่งของข้อมูลเมตาที่บอบบาง การละเมิดอนุสัญญาไม่ใช่เรื่องง่ายที่จะตรวจจับ เพื่อให้การจัดการเนื้อหามีเสถียรภาพเครื่องมือในที่สุดไม่ควรขึ้นอยู่กับชื่อ ความแตกต่างระหว่างส่วนขยายเป็นเพียงคำใบ้ เครื่องมือที่ใช้ไม่ควรคาดหวังว่าจะทำงานเหมือนเดิมตลอดเวลาเช่นการตรวจจับภาษาของ.hไฟล์ใน github.com (อาจมีบางอย่างในความคิดเห็นเช่นshebangเพื่อให้ไฟล์ต้นฉบับเหล่านี้เป็นเมตาดาต้าที่ดีขึ้น แต่มันก็ไม่ธรรมดาเหมือนชื่อไฟล์ดังนั้นจึงไม่น่าเชื่อถือโดยทั่วไป)

ฉันมักจะใช้.hppกับส่วนหัว C ++ และส่วนหัวควรใช้ (ดูแล) ในลักษณะส่วนหัวเท่านั้นเช่นเป็นแม่แบบห้องสมุด สำหรับส่วนหัวอื่น ๆ.hอาจมี.cppไฟล์ที่เกี่ยวข้องเป็นการใช้งานหรือเป็นส่วนหัวที่ไม่ใช่ C ++ ส่วนหลังนั้นเป็นเรื่องเล็กน้อยที่จะแยกความแตกต่างผ่านเนื้อหาของส่วนหัวโดยมนุษย์ (หรือโดยเครื่องมือที่มีเมทาดาทาฝังตัวชัดเจนหากจำเป็น)


0

ส่วนขยายของไฟล์ต้นฉบับอาจมีความหมายต่อระบบการสร้างของคุณตัวอย่างเช่นคุณอาจมีกฎใน makefile สำหรับ.cppหรือ.cไฟล์หรือคอมไพเลอร์ของคุณ (เช่น Microsoftcl.exe ) อาจรวบรวมไฟล์เป็น C หรือ C ++ ขึ้นอยู่กับส่วนขยาย

เนื่องจากคุณต้องระบุชื่อไฟล์ทั้งหมดใน#includeคำสั่งส่วนขยายไฟล์ส่วนหัวจึงไม่เกี่ยวข้อง คุณสามารถรวม.cไฟล์ไว้ในไฟล์ต้นฉบับอื่นได้หากต้องการเพราะเป็นเพียงข้อความต้นฉบับ คอมไพเลอร์ของคุณอาจมีตัวเลือกในการดัมพ์เอาต์พุตที่ประมวลผลล่วงหน้าซึ่งจะทำให้สิ่งนี้ชัดเจน (Microsoft: /Pเพื่อประมวลผลล่วงหน้าไปยังไฟล์, /Eประมวลผลล่วงหน้าstdout, /EPเพื่อละเว้น#lineคำสั่ง, /Cเพื่อเก็บข้อคิดเห็น)

คุณอาจเลือกที่จะใช้.hppสำหรับไฟล์ที่เกี่ยวข้องกับสภาพแวดล้อม C ++ เท่านั้นเช่นพวกเขาใช้คุณสมบัติที่จะไม่คอมไพล์ใน C


0

ไม่มีข้อได้เปรียบสำหรับส่วนขยายใด ๆ นอกเหนือจากส่วนขยายนั้นอาจมีความหมายแตกต่างกันสำหรับคุณคอมไพเลอร์และ / หรือเครื่องมือของคุณ header.hเป็นส่วนหัวที่ถูกต้อง header.hppเป็นส่วนหัวที่ถูกต้อง header.hhเป็นส่วนหัวที่ถูกต้อง header.hxเป็นส่วนหัวที่ถูกต้อง h.headerเป็นส่วนหัวที่ถูกต้อง this.is.not.a.valid.headerเป็นส่วนหัวที่ถูกต้องในการปฏิเสธ ihjkflajfajfklafเป็นส่วนหัวที่ถูกต้อง ตราบใดที่ชื่อสามารถวิเคราะห์ได้อย่างถูกต้องโดยคอมไพเลอร์และระบบไฟล์รองรับมันก็เป็นส่วนหัวที่ถูกต้องและข้อได้เปรียบเพียงอย่างเดียวของส่วนขยายของมันคือสิ่งที่คนอ่านเข้าไป

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

  1. หากมีแนวทางที่กำหนดไว้แล้วให้ปฏิบัติตามเพื่อป้องกันความสับสน
  2. .hหากไฟล์ทั้งหมดที่มาในโครงการสำหรับภาษาเดียวกันใช้ ไม่มีความกำกวม
  3. หากส่วนหัวบางส่วนเข้ากันได้กับหลายภาษาในขณะที่ส่วนอื่น ๆ เข้ากันได้กับภาษาเดียวส่วนขยายจะยึดตามภาษาที่เข้มงวดที่สุดที่ส่วนหัวเข้ากันได้ ส่วนหัวที่เข้ากันได้กับ C หรือกับทั้ง C & C ++ ได้รับ.hในขณะที่ส่วนหัวที่เข้ากันได้กับ C ++ C แต่ไม่ได้รับ.hppหรือ.hhหรือบางสิ่งบางอย่างของการจัดเรียง

แน่นอนว่านี่เป็นเพียงหนึ่งในหลาย ๆวิธีในการจัดการส่วนขยายและคุณไม่สามารถเชื่อถือความประทับใจแรกของคุณได้แม้ว่าสิ่งต่างๆจะดูเหมือนตรงไปตรงมา ตัวอย่างเช่นฉันเคยเห็นการใช้งาน.hสำหรับส่วนหัวปกติและ.tppส่วนหัวที่มีคำจำกัดความเฉพาะสำหรับฟังก์ชันสมาชิกคลาส templated เท่านั้นด้วย.hไฟล์ที่กำหนดคลาส templated รวมถึง.tppไฟล์ที่กำหนดฟังก์ชั่นสมาชิก (แทน.hส่วนหัวที่มีทั้งสองโดยตรง ประกาศฟังก์ชั่นและความหมาย) อีกตัวอย่างหนึ่งคนดีหลายคนมักสะท้อนภาษาส่วนหัวของตนเสมอแม้ว่าจะไม่มีโอกาสคลุมเครือก็ตาม สำหรับพวกเขา.hนั้นเป็นส่วนหัว C เสมอและ.hpp(หรือ.hhหรือ.hxxฯลฯ ) เป็นส่วนหัว C ++ เสมอ และอีกครั้งบางคนใช้.hสำหรับ "ส่วนหัวที่เชื่อมโยงกับไฟล์ต้นฉบับ" และ.hppสำหรับ "ส่วนหัวที่มีฟังก์ชั่นทั้งหมดที่กำหนดไว้แบบอินไลน์"

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

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