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 __cplusplus
makro:
- 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
Saya selalu menganggap
.hpp
header sebagai semacam portmanteau.h
dan.cpp
file ... header yang berisi detail implementasi juga.Biasanya ketika saya melihat (dan menggunakan)
.hpp
sebagai ekstensi, tidak ada.cpp
file yang sesuai . Seperti yang orang lain katakan, ini bukan aturan yang sulit dan cepat, hanya bagaimana saya cenderung menggunakan.hpp
file.sumber
Tidak masalah ekstensi mana yang Anda gunakan. Salah satunya OK.
Saya gunakan
*.h
untuk C dan*.hpp
untuk C ++.sumber
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.
sumber
Saya baru-baru ini mulai menggunakan
*.hpp
untuk header c ++.Alasannya adalah bahwa saya menggunakan emacs sebagai editor utama saya dan masuk secara otomatis ke dalam c-mode ketika Anda memuat
*.h
file dan ke c ++ - mode ketika Anda memuat*.hpp
file.Terlepas dari kenyataan itu saya tidak melihat alasan yang baik untuk memilih
*.h
lebih*.hpp
atau sebaliknya.sumber
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.h
jika sebenarnya tidak ada alasan menentangnya.Karena dokumen ISO / IEC menggunakan notasi file header ini dan tidak ada string yang cocok
.hpp
bahkan 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: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:akan valid, tetapi:
akan menjadi tidak valid. Sebaliknya sama saja.
Dan bahkan
akan menjadi nama file header disertakan yang valid.
Bahkan ini akan sesuai
C++
, itu akan menjadi ide yang sangat bodoh, tho.Dan itu sebabnya
.hpp
juga berlaku.Tapi itu bukan hasil dari komite yang merancang keputusan untuk bahasa tersebut!
Jadi membahas tentang menggunakan
.hpp
sama dengan melakukannya.cc
,.mm
atau apa pun yang saya baca di posting lain tentang topik ini.Saya harus mengakui bahwa saya tidak tahu dari mana
.hpp
asalnya 1 , tetapi saya berani bertaruh penemu alat parsing, IDE atau hal lain yang berkaitan denganC++
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
.h
karena ini adalah ekstensi yang dituntut dalam semua contoh dokumen ISO.Kesimpulan:
Selama Anda tidak melihat / merasa perlu menggunakan
.h
lebih.hpp
atau 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.h
atau.hpp
merupakan 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
.hpp
ekstensi itu.2 Tentu saja saya tidak bisa mengatakan apa yang akan dibawa oleh versi yang akan datang!
sumber
Saya lebih suka .hpp untuk C ++ untuk memperjelas kedua editor dan programmer lain bahwa itu adalah header C ++ daripada file header C.
sumber
C ++ ("C Plus Plus") masuk akal sebagai .cpp
Memiliki file header dengan ekstensi .hpp tidak memiliki aliran logis yang sama.
sumber
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
.h
dan kapan dengan C ++ untuk digunakan.hpp
.Itu pada akhirnya hanyalah sebuah konvensi.
sumber
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.
sumber
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.
sumber
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.)
Saya bukan penggemar konvensi ini karena jika Anda menggunakan perpustakaan populer seperti boost, konsistensi Anda sudah rusak dan Anda sebaiknya menggunakan .hpp.
sumber
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
sumber
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 ++.
sumber
Saya menggunakan .h karena itulah yang digunakan Microsoft, dan apa yang dihasilkan oleh pembuat kode mereka. Tidak perlu melawan arus.
sumber
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
.hpp
oleh bahasa itu sendiri sama sekali.Mudah bagi alat dan manusia untuk membedakan sesuatu . Itu dia.
Dalam penggunaan konvensional (dengan boost, dll),
.hpp
secara khusus header C ++. Di sisi lain,.h
adalah 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.
.hpp
itu sendiri bukan satu-satunya pilihan. Mengapa tidak.hh
atau.hxx
? (Meskipun demikian, Anda biasanya memerlukan setidaknya satu aturan konvensional tentang nama file dan jalur.)Saya pribadi menggunakan keduanya
.h
dan.hpp
dalam proyek C ++ saya. Saya tidak mengikuti konvensi di atas karena:.h
file 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
.hpp
header C ++ dan header harus digunakan (dipertahankan) dengan cara header saja , misalnya sebagai pustaka template. Untuk header lain di.h
, baik ada.cpp
file 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).sumber
Ekstensi file sumber mungkin memiliki arti untuk sistem build Anda, misalnya, Anda mungkin memiliki aturan di file makefile Anda
.cpp
atau.c
file, atau kompiler Anda (misalnya Microsoftcl.exe
) dapat mengkompilasi file sebagai C atau C ++ tergantung pada ekstensi.Karena Anda harus memberikan seluruh nama file ke
#include
arahan, ekstensi file header tidak relevan. Anda dapat memasukkan.c
file 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:/P
untuk preproses ke file,/E
untuk preproses kestdout
,/EP
untuk menghilangkan#line
arahan,/C
untuk mempertahankan komentar)Anda mungkin memilih untuk menggunakan
.hpp
file yang hanya relevan dengan lingkungan C ++, yaitu mereka menggunakan fitur yang tidak dapat dikompilasi dalam C.sumber
Tidak ada keuntungan untuk ekstensi tertentu, selain itu mungkin memiliki arti yang berbeda untuk Anda, kompiler, dan / atau alat Anda.
header.h
adalah header yang valid.header.hpp
adalah header yang valid.header.hh
adalah header yang valid.header.hx
adalah header yang valid.h.header
adalah header yang valid.this.is.not.a.valid.header
adalah header yang valid dalam penolakan.ihjkflajfajfklaf
adalah 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:
.h
. Tidak ada ambiguitas..h
, sedangkan header kompatibel dengan C ++ tetapi tidak C mendapat.hpp
atau.hh
atau 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
.h
untuk header normal, dan.tpp
untuk header yang hanya berisi definisi untuk fungsi anggota kelas templated, dengan.h
file yang mendefinisikan kelas templated termasuk.tpp
file yang menentukan fungsi anggota mereka (bukan.h
header 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,.h
selalu header C dan.hpp
(atau.hh
, atau.hxx
, dll. selalu merupakan header C ++. Dan lagi, beberapa orang menggunakan.h
untuk "header yang terkait dengan file sumber" dan.hpp
untuk "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.
sumber