* .h atau * .hpp untuk definisi kelas Anda

555

Saya selalu menggunakan *.hfile untuk definisi kelas saya, tetapi setelah membaca beberapa kode pustaka dorongan, saya menyadari mereka semua menggunakan *.hpp. Saya selalu memiliki keengganan untuk ekstensi file itu, saya pikir terutama karena saya tidak terbiasa.

Apa kelebihan dan kekurangan menggunakan *.hpplebih dari *.h?

Tandai Ingram
sumber

Jawaban:

528

Berikut adalah beberapa alasan untuk memiliki penamaan yang berbeda dari header C vs C ++:

  • Pemformatan kode otomatis, Anda mungkin memiliki panduan berbeda untuk memformat kode C dan C ++. Jika tajuk dipisahkan oleh ekstensi, Anda dapat mengatur editor untuk menerapkan pemformatan yang sesuai secara otomatis
  • Penamaan, saya sudah mengerjakan proyek di mana ada perpustakaan yang ditulis dalam C dan kemudian pembungkus telah diimplementasikan dalam C ++. Karena header biasanya memiliki nama yang mirip, yaitu Feature.h vs Feature.hpp, mereka mudah dibedakan.
  • Inklusi, mungkin proyek Anda memiliki versi yang lebih sesuai yang tersedia ditulis dalam C ++ tetapi Anda menggunakan versi C (lihat poin di atas). Jika tajuk diberi nama sesuai bahasa yang diterapkan di dalamnya, Anda dapat dengan mudah menemukan semua tajuk-C dan memeriksa versi C ++.

Ingat, C bukan C ++ dan bisa sangat berbahaya untuk mencampur dan mencocokkan kecuali Anda tahu apa yang Anda lakukan. Memberi nama sumber dengan tepat membantu Anda membedakan bahasa.

David Holm
sumber
234

Saya menggunakan .hpp karena saya ingin pengguna membedakan header apa itu header C ++, dan header apa yang header C.

Ini bisa menjadi penting ketika proyek Anda menggunakan kedua modul C dan C ++: Seperti orang lain yang menjelaskan sebelum saya, Anda harus melakukannya dengan sangat hati-hati, dan dimulai dengan "kontrak" yang Anda tawarkan melalui ekstensi.

.hpp: C ++ Header

(Atau .hxx, atau .hh, atau apa pun)

Header ini hanya untuk C ++.

Jika Anda menggunakan modul C, jangan coba-coba memasukkannya. Anda tidak akan menyukainya, karena tidak ada upaya yang dilakukan untuk membuatnya ramah-C (terlalu banyak yang akan hilang, seperti kelebihan fungsi, ruang nama, dll.).

.h: C / C ++ kompatibel atau C Header murni

Header ini dapat dimasukkan oleh sumber C, dan sumber C ++, secara langsung atau tidak langsung.

Itu dapat dimasukkan secara langsung, dilindungi oleh __cplusplusmakro:

  • Yang berarti bahwa, dari sudut pandang C ++, kode yang kompatibel dengan C akan didefinisikan sebagai extern "C".
  • Dari sudut pandang C, semua kode C akan terlihat jelas, tetapi kode C ++ akan disembunyikan (karena tidak akan dikompilasi dalam kompiler C).

Sebagai contoh:

#ifndef MY_HEADER_H
#define MY_HEADER_H

   #ifdef __cplusplus
      extern "C"
      {
   #endif

   void myCFunction() ;

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

#endif // MY_HEADER_H

Atau itu bisa dimasukkan secara tidak langsung oleh header .hpp terkait yang melampirkannya dengan extern "C"deklarasi.

Sebagai contoh:

#ifndef MY_HEADER_HPP
#define MY_HEADER_HPP

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

#endif // MY_HEADER_HPP

dan:

#ifndef MY_HEADER_H
#define MY_HEADER_H

void myCFunction() ;

#endif // MY_HEADER_H
paercebal
sumber
3
Ini cukup tidak lazim di banyak proyek C ++. File .h digunakan untuk hal-hal yang sangat tidak-C'ish.
einpoklum
4
@einpoklum: Tentu saja. Tapi saya mencoba menghindari perilaku "Monkey See Monkey Do". Dalam kasus saat ini, kedua ekstensi (dan lainnya) tersedia, jadi saya mencoba membuatnya benar-benar masuk hitungan. Memiliki kontrak dengan kode yang dibagikan dengan klien ini sangat berguna: Semua orang (yaitu ratusan pengembang) tahu bahwa file ".H" harus digunakan oleh klien menggunakan kompiler C, sehingga tidak ada kesalahan tentang apa yang bisa terjadi di sana atau tidak. Dan setiap orang (termasuk klien) tahu bahwa file ".HPP" tidak akan pernah berusaha menjadi ramah-C. Semua orang menang.
paercebal
4
@ Benebebal, jadi Anda menyarankan .H bukan .h , dan .HPP lebih dari .hpp ?
Geof Sawaya
6
@ GeofSawaya: Tidak, maaf. Itu kebiasaan. Saat menulis artikel, saya menggunakan ekstensi dalam huruf besar untuk membedakan file berdasarkan jenisnya, seperti "file .HPP". Tetapi ekstensi dari file aktual yang ada di hard disk saya selalu dalam huruf kecil, bahkan dalam namanya tidak, seperti "MyClass.hpp" atau "module.hpp"
paercebal
4
Terima kasih, @ bandercal. Saya mulai
bertingkah aneh
48

Saya selalu menganggap .hppheader sebagai semacam portmanteau .hdan.cpp file ... header yang berisi detail implementasi juga.

Biasanya ketika saya melihat (dan menggunakan) .hppsebagai ekstensi, tidak ada .cppfile yang sesuai . Seperti yang orang lain katakan, ini bukan aturan yang sulit dan cepat, hanya bagaimana saya cenderung menggunakan .hppfile.

Perculator
sumber
31

Tidak masalah ekstensi mana yang Anda gunakan. Salah satunya OK.

Saya gunakan *.huntuk C dan *.hppuntuk C ++.

Burkhard
sumber
23

EDIT [Saran yang ditambahkan dari Dan Nissenbaum]:

Dengan satu konvensi, file .hpp digunakan ketika prototipe didefinisikan di header itu sendiri. Definisi header seperti itu berguna untuk templat, karena kompiler membuat kode untuk setiap jenis hanya pada instantiasi templat. Oleh karena itu, jika mereka tidak didefinisikan dalam file header, definisi mereka tidak akan diselesaikan pada waktu tautan dari unit kompilasi lainnya. Jika proyek Anda adalah proyek C ++ saja yang banyak menggunakan templat, konvensi ini akan bermanfaat.

Perpustakaan templat tertentu yang mematuhi konvensi ini menyediakan header dengan ekstensi .hpp untuk menunjukkan bahwa mereka tidak memiliki file .cpp yang sesuai.

konvensi lain adalah menggunakan .h untuk header C dan .hpp untuk C ++; contoh yang baik akan menjadi perpustakaan dorongan.

Kutipan dari Boost FAQ,

Ekstensi file mengkomunikasikan "tipe" file, baik ke manusia maupun ke program komputer. Ekstensi '.h' digunakan untuk file header C, dan karenanya mengkomunikasikan hal yang salah tentang file header C ++. Tidak menggunakan ekstensi tidak mengomunikasikan apa pun dan memaksa inspeksi konten file untuk menentukan jenisnya. Menggunakan '.hpp' secara jelas mengidentifikasikannya sebagai file header C ++, dan berfungsi dengan baik dalam praktik sebenarnya. (Rainer Deyke)

ProgramCpp
sumber
Tidak ada yang benar, tidak ada bedanya apakah file tersebut .h atau .hpp ketika menyangkut pembuatan atau penautan kode.
Mark Ingram
bukankah itu hanya masalah konvensi? Pustaka C ++ std menyediakan semua tajuknya tanpa ekstensi apa pun. menggunakan ".hpp" hanya menunjukkan bahwa prototipe didefinisikan dalam file yang sama dan tidak akan ada file .cpp yang sesuai.
ProgramCpp
5
Jawaban ini berguna, saya pikir, dengan pengecualian bahwa ia kehilangan ungkapan yang sangat sederhana, tetapi penting,: "berdasarkan kesepakatan, bukan oleh aturan bahasa" (di suatu tempat).
Dan Nissenbaum
13

Saya baru-baru ini mulai menggunakan *.hppuntuk header c ++.

Alasannya adalah bahwa saya menggunakan emacs sebagai editor utama saya dan masuk secara otomatis ke dalam c-mode ketika Anda memuat *.hfile dan ke c ++ - mode ketika Anda memuat *.hppfile.

Terlepas dari kenyataan itu saya tidak melihat alasan yang baik untuk memilih *.hlebih *.hppatau sebaliknya.

Serge
sumber
7
Secara pribadi, saya pikir menyoroti C ++ adalah ide yang baik bahkan dalam header C. Saya telah berada di kedua ujung situasi di mana seseorang ingin memasukkan header C Anda dari C ++, tetapi menggunakan kata kunci C ++ sebagai nama parameter ...
Steve Jessop
12

Saya menjawab ini sebagai pengingat, untuk memberikan komentar saya pada "user1949346" jawaban untuk OP yang sama ini.


Jadi, seperti yang sudah dijawab oleh banyak orang: cara apa pun baik-baik saja. Diikuti oleh penekanan pada kesan mereka sendiri.

Pendahuluan, seperti juga dalam komentar yang disebutkan sebelumnya disebutkan, pendapat saya adalah C++ekstensi tajuk diusulkan untuk menjadi .hjika sebenarnya tidak ada alasan menentangnya.

Karena dokumen ISO / IEC menggunakan notasi file header ini dan tidak ada string yang cocok .hppbahkan terjadi dalam dokumentasi bahasa merekaC++ .

Tapi saya sekarang bertujuan untuk alasan yang bisa diterima. MENGAPA bagaimanapun juga tidak masalah, dan terutama mengapa itu bukan masalah bahasa itu sendiri.

Jadi di sini kita mulai.

The C++dokumentasi (aku benar-benar mengambil referensi dari versi N3690) mendefinisikan bahwa header harus sesuai dengan sintaks berikut:

2.9 Nama judul

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 "

Jadi saat kita dapat mengekstrak dari bagian ini, nama file header mungkin adalah apa pun yang valid dalam kode sumber juga. Kecuali berisi '\n'karakter dan tergantung pada apakah itu akan dimasukkan oleh <>itu tidak diperbolehkan mengandung a >. Atau cara lain jika disertakan oleh ""-sertakan itu tidak diizinkan mengandung a ".

Dengan kata lain: jika Anda memiliki lingkungan yang mendukung nama file seperti prettyStupidIdea.>, sertakan seperti:

#include "prettyStupidIdea.>"

akan valid, tetapi:

#include <prettyStupidIdea.>>

akan menjadi tidak valid. Sebaliknya sama saja.

Dan bahkan

#include <<.<>

akan menjadi nama file header disertakan yang valid.

Bahkan ini akan sesuai C++, itu akan menjadi ide yang sangat bodoh, tho.

Dan itu sebabnya .hppjuga berlaku.

Tapi itu bukan hasil dari komite yang merancang keputusan untuk bahasa tersebut!

Jadi membahas tentang menggunakan .hppsama dengan melakukannya .cc, .mmatau apa pun yang saya baca di posting lain tentang topik ini.

Saya harus mengakui bahwa saya tidak tahu dari mana .hppasalnya 1 , tetapi saya berani bertaruh penemu alat parsing, IDE atau hal lain yang berkaitan dengan C++ide ini untuk mengoptimalkan beberapa proses internal atau hanya untuk menciptakan beberapa (mungkin bahkan untuk mereka tentu perlu ) konvensi penamaan baru.

Tetapi ini bukan bagian dari bahasa.

Dan setiap kali seseorang memutuskan untuk menggunakannya dengan cara ini. Mungkin itu karena dia suka sebagian besar atau karena beberapa aplikasi alur kerja memerlukannya, tidak pernah 2 merupakan persyaratan bahasa. Jadi siapa pun yang mengatakan "pp adalah karena digunakan dengan C ++", tentu saja salah dalam hal definisi bahasa.

C ++ memungkinkan apa pun yang menghormati paragraf sebelumnya. Dan jika ada sesuatu yang diusulkan komite untuk digunakan, maka itu digunakan .hkarena ini adalah ekstensi yang dituntut dalam semua contoh dokumen ISO.

Kesimpulan:

Selama Anda tidak melihat / merasa perlu menggunakan .hlebih .hppatau sebaliknya, Anda tidak perlu repot-repot. Karena keduanya akan membentuk nama header yang valid dengan kualitas yang sama sehubungan dengan standar. Dan oleh karena itu segala sesuatu yang MEMBUTUHKAN Anda untuk menggunakan .hatau .hppmerupakan batasan tambahan dari standar yang bahkan dapat bertentangan dengan pembatasan tambahan lainnya yang tidak sesuai satu sama lain. Tetapi karena OP tidak menyebutkan batasan bahasa tambahan, ini adalah satu-satunya jawaban yang benar dan dapat disetujui untuk pertanyaan itu

" * .h atau * .hpp untuk definisi kelas Anda " adalah:

Keduanya sama-sama benar dan berlaku selama tidak ada batasan eksternal.


1 Dari apa yang saya tahu, tampaknya, kerangka kerja dorongan yang muncul dengan .hppekstensi itu.

2 Tentu saja saya tidak bisa mengatakan apa yang akan dibawa oleh versi yang akan datang!

dhein
sumber
7

Saya lebih suka .hpp untuk C ++ untuk memperjelas kedua editor dan programmer lain bahwa itu adalah header C ++ daripada file header C.

JohnMcG
sumber
6

C ++ ("C Plus Plus") masuk akal sebagai .cpp

Memiliki file header dengan ekstensi .hpp tidak memiliki aliran logis yang sama.

Dynite
sumber
6

Anda dapat memanggil termasuk apa pun yang Anda suka.

Hanya perlu menentukan nama lengkap di #include.

Saya menyarankan bahwa jika Anda bekerja dengan C untuk digunakan .hdan kapan dengan C ++ untuk digunakan .hpp.

Itu pada akhirnya hanyalah sebuah konvensi.

slashmais
sumber
5

Codegear C ++ Builder menggunakan .hpp untuk file header yang dihasilkan secara otomatis dari file sumber Delphi, dan file .h untuk file header "Anda".

Jadi, ketika saya sedang menulis file header C ++ saya selalu menggunakan .h.

Roddy
sumber
5

Dalam salah satu pekerjaan saya di awal 90-an, kami menggunakan .cc dan .hh masing-masing untuk file sumber dan header. Saya masih lebih suka daripada semua alternatif, mungkin karena itu paling mudah diketik.

camh
sumber
5

Bjarne Stroustrup dan Herb Sutter memiliki pernyataan untuk pertanyaan ini dalam pedoman C ++ Core mereka yang ditemukan di: https://github.com/isocpp/CppCoreGuidelines/blob/master/CppCoreGuidelines.md#S-source yang juga merujuk pada perubahan terbaru dalam ekstensi standar (C ++ 11, C ++ 14, dll.)

SF.1: Gunakan akhiran .cpp untuk file kode dan .h untuk file antarmuka jika proyek Y Anda belum mengikuti konvensi lain Alasan

Itu adalah konvensi yang sudah berlangsung lama. Tetapi konsistensi lebih penting, jadi jika proyek Anda menggunakan sesuatu yang lain, ikuti itu. Catatan

Konvensi ini mencerminkan pola penggunaan umum: Header lebih sering dibagikan dengan C untuk dikompilasi sebagai C ++ dan C, yang biasanya menggunakan .h, dan lebih mudah untuk menamai semua header .h daripada memiliki ekstensi yang berbeda untuk hanya header yang dimaksudkan untuk dibagikan dengan C. Di sisi lain, file implementasi jarang dibagikan dengan C dan biasanya harus dibedakan dari file .c, jadi biasanya yang terbaik untuk memberi nama semua file implementasi C ++ sesuatu yang lain (seperti .cpp).

Nama spesifik .h dan .cpp tidak diperlukan (hanya disarankan sebagai default) dan nama lain sedang digunakan secara luas. Contohnya adalah .hh, .C, dan .cxx. Gunakan nama seperti itu secara setara. Dalam dokumen ini, kami merujuk ke .h dan .cpp> sebagai singkatan untuk file header dan implementasi, meskipun ekstensi yang sebenarnya mungkin berbeda.

IDE Anda (jika Anda menggunakannya) mungkin memiliki pendapat yang kuat tentang kecukupan.

Saya bukan penggemar konvensi ini karena jika Anda menggunakan perpustakaan populer seperti boost, konsistensi Anda sudah rusak dan Anda sebaiknya menggunakan .hpp.

ruun
sumber
4

Seperti yang banyak disebutkan di sini, saya juga lebih suka menggunakan .hpp untuk pustaka header-saja yang menggunakan kelas templat / fungsi. Saya lebih suka menggunakan .h untuk file header disertai dengan file sumber .cpp atau perpustakaan bersama atau statis.

Sebagian besar perpustakaan yang saya kembangkan berbasis template dan karenanya hanya perlu header, tetapi ketika menulis aplikasi saya cenderung memisahkan deklarasi dari implementasi dan berakhir dengan file .h dan .cpp

Enzo
sumber
3

Untungnya, ini sederhana.

Anda harus menggunakan ekstensi .hpp jika Anda bekerja dengan C ++ dan Anda harus menggunakan .h untuk C atau mencampur C dan C ++.

Nykal
sumber
2

Saya menggunakan .h karena itulah yang digunakan Microsoft, dan apa yang dihasilkan oleh pembuat kode mereka. Tidak perlu melawan arus.

Mark tebusan
sumber
tidak di mana-mana, dalam banyak contoh (misalnya WINDDK) yang mereka gunakan .hpp
marsh-goyangkan
13
Saya tidak akan menyebut Microsoft 'gandum' ketika datang ke C ++.
developerbmw
@ Bret itu saat itulah pekerjaan Anda. Dan bahkan jika tidak, itu adalah kompiler yang sangat populer.
Mark Ransom
@ MarkRansom Saya lebih mengacu pada sejarah Microsoft menggunakan C. IMO VC ++ adalah kompiler yang sangat baik.
developerbmw
1
@developerbmw saya akan mengatakan MSVC adalah butir untuk program Windows, dan GCC adalah butir untuk program * nix, secara pribadi. Mereka adalah yang kebanyakan kompiler lain untuk platform tersebut cenderung mencoba untuk tetap kompatibel, setahu saya.
Waktu Justin - Kembalikan Monica
1

Dalam "Bahasa Pemrograman C ++, Edisi Ketiga oleh Bjarne Stroustrup", buku C ++ yang harus dibaca nº1, ia menggunakan * .h. Jadi saya menganggap praktik terbaik adalah menggunakan *. H.

Namun, * .hpp juga baik-baik saja!


sumber
1
Jika seseorang menulis buku tentang sesuatu yang dia pelajari dari orang lain yang mempelajarinya dari buku lain (mungkin dengan keberuntungan yang sama), ditulis oleh seseorang yang mungkin memiliki sumber utama yang tersedia, maka itu adalah apa yang mereka lakukan apa pun tetapi bukan tanda untuk menjadi praktik terbaik.
dhein
Hanya untuk menyebutkan: Saya benar-benar telah memilih ini. Tapi saya akan memutarnya, jika dikatakan "ISO / IEC N3690" atau konsep C ++ lainnya bukan "Bahasa Pemrograman C ++, Edisi Ketiga oleh Bjarne Stroustrup". Meskipun ini akan menjadi poin yang valid, karena tidak disebutkan .hppoleh bahasa itu sendiri sama sekali.
dhein
9
@zaibis kau tahu bahwa Bjarne Stroustrup menemukan C ++ kan?
tumtumtum
@tumtumtum: diakui, saya tidak mengetahui hal ini. Tapi bagaimanapun, bahkan dalam kasus itu, masih merupakan dokumen komite, mempertahankan standar, yang merupakan referensi yang harus diambil. Bahkan jika dia adalah penemu bahasa, itu bukan keputusannya lagi. Jadi, sementara ini membuat jawaban ini lebih dapat dipertanyakan, itu masih bukan alasan yang valid.
dhein
1

Mudah bagi alat dan manusia untuk membedakan sesuatu . Itu dia.

Dalam penggunaan konvensional (dengan boost, dll), .hppsecara khusus header C ++. Di sisi lain, .hadalah untuk non-C ++ - hanya header (terutama C). Untuk mendeteksi secara tepat bahasa konten umumnya sulit karena ada banyak kasus non-sepele, jadi perbedaan ini sering membuat alat yang siap digunakan mudah untuk ditulis. Bagi manusia, begitu mendapatkan konvensi, ia juga mudah diingat dan mudah digunakan.

Namun, saya akan menunjukkan bahwa konvensi itu sendiri tidak selalu berhasil, seperti yang diharapkan.

  • Ini tidak dipaksakan oleh spesifikasi bahasa , baik C maupun C ++. Ada banyak proyek yang tidak mengikuti konvensi. Setelah Anda perlu menggabungkan (untuk mencampur) mereka, itu bisa merepotkan.
  • .hppitu sendiri bukan satu-satunya pilihan. Mengapa tidak .hhatau .hxx? (Meskipun demikian, Anda biasanya memerlukan setidaknya satu aturan konvensional tentang nama file dan jalur.)

Saya pribadi menggunakan keduanya .hdan .hppdalam proyek C ++ saya. Saya tidak mengikuti konvensi di atas karena:

  • Bahasa yang digunakan oleh setiap bagian proyek didokumentasikan secara eksplisit. Tidak ada peluang untuk menggabungkan C dan C ++ dalam modul (direktori) yang sama. Setiap perpustakaan pihak ke-3 diharuskan untuk mematuhi aturan ini.
  • Spesifikasi bahasa yang sesuai dan dialek bahasa yang diizinkan yang digunakan oleh proyek juga didokumentasikan. (Bahkan, saya bahkan mendokumentasikan sumber fitur standar dan perbaikan bug (pada standar bahasa) yang digunakan .) Ini agak lebih penting daripada membedakan bahasa yang digunakan karena terlalu rawan kesalahan dan biaya pengujian (mis. kompatibilitas kompiler) mungkin signifikan (rumit dan memakan waktu), terutama dalam proyek yang sudah hampir murni C ++. Nama file terlalu lemah untuk menangani ini.
  • Bahkan untuk dialek C ++ yang sama, mungkin ada properti yang lebih penting yang cocok dengan perbedaannya. Misalnya, lihat konvensi di bawah ini.
  • Nama file pada dasarnya adalah potongan metadata yang rapuh. Pelanggaran konvensi tidak mudah dideteksi. Agar dapat menangani konten secara stabil, alat pada akhirnya tidak hanya bergantung pada nama. Perbedaan antara ekstensi hanyalah sebuah petunjuk. Alat yang menggunakannya juga tidak diharapkan berperilaku sama setiap saat, mis. Mendeteksi bahasa .hfile di github.com. (Mungkin ada sesuatu dalam komentar seperti shebang untuk file sumber ini menjadi metadata yang lebih baik, tetapi bahkan tidak konvensional seperti nama file, jadi juga tidak dapat diandalkan secara umum.)

Saya biasanya menggunakan .hppheader C ++ dan header harus digunakan (dipertahankan) dengan cara header saja , misalnya sebagai pustaka template. Untuk header lain di .h, baik ada .cppfile yang sesuai sebagai implementasi, atau itu adalah header non-C ++. Yang terakhir sepele untuk membedakan melalui isi header oleh manusia (atau dengan alat dengan metadata tertanam eksplisit, jika diperlukan).

FrankHB
sumber
0

Ekstensi file sumber mungkin memiliki arti untuk sistem build Anda, misalnya, Anda mungkin memiliki aturan di file makefile Anda .cppatau .cfile, atau kompiler Anda (misalnya Microsoft cl.exe) dapat mengkompilasi file sebagai C atau C ++ tergantung pada ekstensi.

Karena Anda harus memberikan seluruh nama file ke #includearahan, ekstensi file header tidak relevan. Anda dapat memasukkan .cfile dalam file sumber lain jika Anda suka, karena itu hanya termasuk tekstual. Kompiler Anda mungkin memiliki opsi untuk membuang output preprocessed yang akan membuat ini lebih jelas (Microsoft: /Puntuk preproses ke file, /Euntuk preproses ke stdout, /EPuntuk menghilangkan #linearahan, /Cuntuk mempertahankan komentar)

Anda mungkin memilih untuk menggunakan .hppfile yang hanya relevan dengan lingkungan C ++, yaitu mereka menggunakan fitur yang tidak dapat dikompilasi dalam C.

Mike Dimmick
sumber
0

Tidak ada keuntungan untuk ekstensi tertentu, selain itu mungkin memiliki arti yang berbeda untuk Anda, kompiler, dan / atau alat Anda. header.hadalah header yang valid. header.hppadalah header yang valid. header.hhadalah header yang valid. header.hxadalah header yang valid. h.headeradalah header yang valid. this.is.not.a.valid.headeradalah header yang valid dalam penolakan. ihjkflajfajfklafadalah header yang valid. Selama nama tersebut dapat diuraikan dengan benar oleh kompiler, dan sistem file mendukungnya, itu adalah header yang valid, dan satu-satunya keuntungan untuk ekstensi adalah apa yang dibacanya.

Karena itu, dapat membuat asumsi secara akurat berdasarkan ekstensi sangat berguna, jadi sebaiknya menggunakan seperangkat aturan yang mudah dimengerti untuk file header Anda. Secara pribadi, saya lebih suka melakukan sesuatu seperti ini:

  1. Jika sudah ada pedoman yang ditetapkan, ikuti mereka untuk mencegah kebingungan.
  2. Jika semua file sumber dalam proyek ini untuk bahasa yang sama, gunakan .h. Tidak ada ambiguitas.
  3. Jika beberapa tajuk kompatibel dengan beberapa bahasa, sementara yang lain hanya kompatibel dengan satu bahasa, ekstensi didasarkan pada bahasa yang paling ketat dengan tajuk yang kompatibel. Header yang kompatibel dengan C, atau dengan kedua C & C ++, mendapat .h, sedangkan header kompatibel dengan C ++ tetapi tidak C mendapat .hppatau .hhatau semacamnya.

Ini, tentu saja, hanyalah salah satu dari banyak cara untuk menangani ekstensi, dan Anda tidak dapat selalu memercayai kesan pertama Anda bahkan jika segala sesuatunya tampak langsung. Sebagai contoh, saya telah melihat menyebutkan penggunaan .huntuk header normal, dan .tppuntuk header yang hanya berisi definisi untuk fungsi anggota kelas templated, dengan .hfile yang mendefinisikan kelas templated termasuk .tppfile yang menentukan fungsi anggota mereka (bukan .hheader yang secara langsung berisi kedua deklarasi fungsi dan definisi). Sebagai contoh lain, banyak orang baik selalu merefleksikan bahasa header dalam ekstensi, bahkan ketika tidak ada kemungkinan ambiguitas; bagi mereka, .hselalu header C dan .hpp(atau.hh , atau.hxx, dll. selalu merupakan header C ++. Dan lagi, beberapa orang menggunakan .huntuk "header yang terkait dengan file sumber" dan .hppuntuk "header dengan semua fungsi yang didefinisikan inline".

Mempertimbangkan hal ini, keuntungan utama akan datang secara konsisten dengan menamai header Anda dalam gaya yang sama, dan membuat gaya itu mudah terlihat oleh siapa pun yang memeriksa kode Anda. Dengan cara ini, siapa pun yang akrab dengan gaya pengkodean Anda yang biasa akan dapat menentukan apa yang Anda maksud dengan ekstensi yang diberikan hanya dengan pandangan sepintas.

Justin Time - Pasang kembali Monica
sumber