Dalam bahasa pemrograman C dan C ++, apa perbedaan antara menggunakan kurung sudut dan menggunakan kutipan dalam include
pernyataan, sebagai berikut?
#include <filename>
#include "filename"
c++
c
include
header-files
c-preprocessor
quest49
sumber
sumber
Jawaban:
Dalam praktiknya, perbedaannya adalah di lokasi di mana preprocessor mencari file yang disertakan.
Untuk
#include <filename>
pencarian preprosesor dengan cara yang bergantung pada implementasi, biasanya dalam direktori pencarian yang ditentukan sebelumnya oleh kompiler / IDE. Metode ini biasanya digunakan untuk memasukkan file header perpustakaan standar.Untuk
#include "filename"
pencarian preprosesor pertama kali di direktori yang sama dengan file yang berisi arahan, dan kemudian mengikuti jalur pencarian yang digunakan untuk#include <filename>
formulir. Metode ini biasanya digunakan untuk memasukkan file header yang ditentukan pemrogram.Deskripsi yang lebih lengkap tersedia di dokumentasi GCC di jalur pencarian .
sumber
#include <...>
gunakan paket yang diinstal pada sistem dan#include "..."
gunakan versi repositori terdekat. Saya mungkin memiliki mereka mundur. Either way, termasuk penjaga di header paket diawali dengan garis bawah. (Ini bisa menjadi konvensi untuk paket-paket atau mungkin cara untuk dengan sengaja mencegah pencampuran keduanya, meskipun kualifikasi versi akan lebih masuk akal bagi saya.)Satu-satunya cara untuk mengetahui adalah membaca dokumentasi implementasi Anda.
Dalam standar C , bagian 6.10.2, paragraf 2 hingga 4 menyatakan:
sumber
Urutan karakter antara <dan> merujuk ke header secara unik, yang tidak harus berupa file. Implementasi cukup bebas untuk menggunakan urutan karakter seperti yang mereka inginkan. (Namun, sebagian besar, hanya memperlakukannya sebagai nama file dan melakukan pencarian di jalur sertakan , seperti keadaan posting lainnya.)
Jika
#include "file"
formulir digunakan, implementasi pertama mencari file dari nama yang diberikan, jika didukung. Jika tidak (didukung), atau jika pencarian gagal, implementasi berperilaku seolah-olah#include <file>
formulir other ( ) digunakan.Juga, bentuk ketiga ada dan digunakan ketika
#include
arahan tidak cocok dengan salah satu formulir di atas. Dalam bentuk ini, beberapa preprocessing dasar (seperti ekspansi makro) dilakukan pada "operan" dari#include
direktif, dan hasilnya diharapkan sesuai dengan salah satu dari dua bentuk lainnya.sumber
<
dan>
sebagai kunci untuk mengindeks ke perpustakaan.Beberapa jawaban yang baik di sini membuat referensi ke standar C tetapi lupa standar POSIX, terutama perilaku spesifik dari perintah c99 (misalnya C compiler) .
Menurut The Open Group Base Spesifikasi Issue 7 ,
Jadi, dalam lingkungan yang sesuai dengan POSIX, dengan kompiler C yang memenuhi syarat POSIX,
#include "file.h"
kemungkinan besar akan mencari./file.h
terlebih dahulu, di mana.
direktori di mana file dengan#include
pernyataan, sementara#include <file.h>
, kemungkinan akan mencari/usr/include/file.h
pertama, di mana/usr/include
sistem Anda didefinisikan tempat biasa untuk header (sepertinya tidak ditentukan oleh POSIX).sumber
c99
- yang merupakan nama POSIX untuk kompiler C. (Standar POSIX 2008 hampir tidak bisa merujuk ke C11; pembaruan 2013 ke POSIX 2008 tidak mengubah standar C yang dimaksud.)-L
.Dokumentasi GCC mengatakan hal berikut tentang perbedaan antara keduanya:
sumber
Itu:
dengan
.
menjadi direktori file di mana#include
terkandung dalam, dan / atau direktori kerja saat ini dari kompiler, dan / ataudefault_include_paths
dan
Jika
./
ada<default_include_paths>
, maka tidak ada bedanya.Jika
mypath/myfile
ada di direktori include lain, perilaku tidak terdefinisi.sumber
#include "mypath/myfile"
tidak setara dengan#include "./mypath/myfile"
. Seperti jawaban piCookie mengatakan, tanda kutip ganda memberitahu kompiler untuk mencari dengan cara yang ditentukan implementasi - yang mencakup pencarian di tempat yang ditentukan#include <...>
. (Sebenarnya, ini mungkin setara, tetapi hanya karena, misalnya,/usr/include/mypath/myfile
dapat disebut sebagai/usr/include/./mypath/myfile
- setidaknya pada sistem mirip Unix.)defaultincludepaths
, sebagai ganti untuk memberi makna lain pada.
(sebagaimana dimaksud di atas). Ini memiliki konsekuensi yang diharapkan baik#include "..."
dan#include <...>
cari dalam dirpathThe
<file>
termasuk memberitahu preprocessor untuk mencari di-I
direktori dan direktori yang telah ditetapkan pertama , kemudian di direktori c file. The"file"
termasuk memberitahu preprocessor untuk mencari direktori file sumber ini pertama , dan kemudian kembali ke-I
dan telah ditetapkan. Lagi pula, semua tujuan dicari, hanya urutan pencariannya yang berbeda.Standar 2011 sebagian besar membahas menyertakan file dalam "16.2 Sumber file inklusi".
Perhatikan bahwa
"xxx"
formulir menurunkan<xxx>
bentuk jika file tidak ditemukan. Sisanya ditentukan implementasi.sumber
-I
bisnis ini ditentukan?-I
.#include <file.h>
memberitahu kompiler untuk mencari header di direktori "include" -nya, misalnya untuk MinGW, kompiler akan mencarifile.h
di C: \ MinGW \ include \ atau di mana pun kompiler Anda diinstal.#include "file"
memberitahu kompiler untuk mencari direktori saat ini (yaitu direktori tempat file sumber berada)file
.Anda dapat menggunakan
-I
bendera untuk GCC untuk memberi tahu bahwa, ketika menemukan tanda kurung siku, ia juga harus mencari header di direktori setelahnya-I
. GCC akan memperlakukan direktori setelah bendera seolah-olah itu adalahincludes
direktori.Misalnya, jika Anda memiliki file yang dipanggil
myheader.h
di direktori Anda sendiri, Anda bisa mengatakan#include <myheader.h>
jika Anda memanggil GCC dengan flag-I .
(menunjukkan bahwa itu harus mencari termasuk dalam direktori saat ini.)Tanpa
-I
tanda, Anda harus menggunakan#include "myheader.h"
untuk memasukkan file, atau pindahmyheader.h
keinclude
direktori kompiler Anda.sumber
Secara standar - ya, mereka berbeda:
Perhatikan bahwa standar tidak memberi tahu hubungan apa pun antara perilaku yang ditentukan implementasi. Bentuk pertama mencari dalam satu cara yang ditentukan implementasi, dan yang lainnya dengan cara yang mungkin (mungkin lainnya) yang ditentukan implementasi. Standar ini juga menentukan bahwa file yang disertakan tertentu harus ada (misalnya,
<stdio.h>
).Secara formal Anda harus membaca manual untuk kompiler Anda, namun biasanya (berdasarkan tradisi)
#include "..."
formulir mencari direktori file di mana#include
ditemukan pertama kali, dan kemudian direktori yang#include <...>
dicari bentuknya (jalur sertakan, misalnya header sistem ).sumber
Terima kasih atas jawaban yang bagus, esp. Adam Stelmaszczyk dan piCookie, dan aib.
Seperti banyak programmer, saya telah menggunakan konvensi informal menggunakan
"myApp.hpp"
formulir untuk file aplikasi spesifik, dan<libHeader.hpp>
formulir untuk file sistem perpustakaan dan kompiler, yaitu file yang ditentukan dalam/I
danINCLUDE
variabel lingkungan, selama bertahun-tahun berpikir itu adalah standar.Namun, standar C menyatakan bahwa urutan pencarian spesifik implementasi, yang dapat membuat portabilitas rumit. Untuk membuat keadaan menjadi lebih buruk, kami menggunakan jam, yang secara otomatis mencari tahu di mana file yang disertakan. Anda dapat menggunakan jalur relatif atau absolut untuk file sertakan Anda. yaitu
Versi MSVS yang lebih lama membutuhkan backslash ganda (\\), tetapi sekarang tidak diperlukan. Saya tidak tahu kapan itu berubah. Cukup gunakan garis miring untuk kompatibilitas dengan 'nix (Windows akan menerimanya).
Jika Anda benar - benar khawatir tentang hal itu, gunakan
"./myHeader.h"
untuk menyertakan file dalam direktori yang sama dengan kode sumber (proyek saya saat ini, sangat besar memiliki duplikat termasuk nama file yang berserakan - benar-benar masalah manajemen konfigurasi).Berikut penjelasan MSDN yang disalin di sini untuk kenyamanan Anda).
sumber
Setidaknya untuk versi GCC <= 3.0, bentuk braket sudut tidak menghasilkan ketergantungan antara file yang disertakan dan yang disertakan.
Jadi, jika Anda ingin membuat aturan dependensi (menggunakan opsi GCC -M untuk contoh), Anda harus menggunakan formulir yang dikutip untuk file yang harus dimasukkan dalam pohon dependensi.
(Lihat http://gcc.gnu.org/onlinedocs/cpp/Invocation.html )
sumber
Untuk
#include ""
kompiler biasanya mencari folder file yang berisi yang termasuk dan kemudian folder lainnya. Untuk#include <>
kompiler tidak mencari folder file saat ini.sumber
<filename>
dan"filename"
mencari tempat yang ditentukan implementasi.Saat Anda menggunakan #include <filename>, pra-prosesor mencari file dalam direktori file header C \ C ++ (stdio.h \ cstdio, string, vektor, dll.). Tapi, ketika Anda menggunakan #include "nama file": pertama, pra-prosesor mencari file di direktori saat ini, dan jika tidak ada di sini - ia mencarinya di direktori file header C \ C ++.
sumber
#include
arahan tidak sepenuhnya terkait dengan file sama sekali.Tanda kurung #include with angle akan mencari "daftar tempat yang bergantung pada implementasi" (yang merupakan cara yang sangat rumit untuk mengatakan "header sistem") untuk menyertakan file.
Sebuah #include dengan tanda kutip hanya akan mencari file (dan, "dalam cara yang tergantung pada implementasi", bleh). Yang berarti, dalam bahasa Inggris normal, itu akan mencoba menerapkan path / nama file yang Anda lemparkan padanya dan tidak akan menambah alur sistem atau merusaknya.
Juga, jika #include "" gagal, itu dibaca kembali sebagai #include <> oleh standar.
The dokumentasi gcc memiliki (compiler tertentu) deskripsi yang meskipun menjadi spesifik untuk gcc dan tidak standar, adalah jauh lebih mudah dimengerti daripada pengacara gaya bicara dari standar ISO.
sumber
zlib.h
di jalur pencarian 'pengguna' saya, dan versi yang berbeda ada di jalur pencarian sistem, lalu apakah#include <zlib.h>
termasuk versi sistem dan#include "zlib.h"
termasuk saya sendiri?Contoh:
Nama file di sini adalah
Seller.h
:Dalam implementasi kelas (misalnya,,
Seller.cpp
dan dalam file lain yang akan menggunakan fileSeller.h
), header yang ditentukan oleh pengguna sekarang harus dimasukkan, sebagai berikut:sumber
#include <>
untuk file header yang sudah ditentukan sebelumnyaJika file header sudah ditentukan maka Anda cukup menulis nama file header di kurung sudut, dan akan terlihat seperti ini (dengan asumsi kami memiliki nama file header yang sudah ditentukan sebelumnya iostream):
#include " "
adalah untuk file header yang didefinisikan programmerJika Anda (programmer) menulis file header Anda sendiri maka Anda akan menulis nama file header dalam tanda kutip. Jadi, misalkan Anda menulis file header yang disebut
myfile.h
, maka ini adalah contoh bagaimana Anda akan menggunakan arahan include untuk memasukkan file itu:sumber
Banyak jawaban di sini fokus pada jalur yang akan dicari oleh kompiler untuk menemukan file. Walaupun ini adalah apa yang dilakukan kebanyakan kompiler, kompiler yang menyesuaikan diizinkan untuk diprogram dengan efek dari header standar, dan untuk memperlakukan, katakanlah,
#include <list>
sebagai saklar, dan itu tidak perlu ada sebagai file sama sekali.Ini bukan murni hipotetis. Setidaknya ada satu kompiler yang bekerja seperti itu.
#include <xxx>
Disarankan hanya menggunakan header standar.sumber
digunakan untuk memasukkan file perpustakaan standar. Jadi kompiler akan memeriksa di lokasi di mana header perpustakaan standar berada.
akan memberitahu kompiler untuk memasukkan file header yang ditentukan pengguna. Jadi kompiler akan memeriksa file header ini di folder saat ini atau
-I
folder yang ditentukan.sumber
Dalam C ++, sertakan file dalam dua cara:
Yang pertama adalah #include yang memberi tahu preprocessor untuk mencari file di lokasi default yang telah ditentukan. Lokasi ini sering merupakan variabel lingkungan TERMASUK yang menunjukkan path untuk memasukkan file.
Dan tipe kedua adalah #include "nama file" yang memberi tahu preprocessor untuk mencari file di direktori saat ini terlebih dahulu, kemudian mencarinya di lokasi yang telah ditentukan pengguna.
sumber
Formulir 1 - #termasuk <xxx>
Pertama, mencari keberadaan file header di direktori saat ini dari mana direktif dipanggil. Jika tidak ditemukan, maka ia mencari dalam daftar direktori sistem standar yang telah dikonfigurasikan sebelumnya.
Formulir 2 - #termasuk "xxx"
Ini mencari keberadaan file header di direktori saat ini dari mana direktif dipanggil.
Daftar direktori pencarian yang tepat tergantung pada sistem target, bagaimana GCC dikonfigurasi, dan di mana ia diinstal. Anda dapat menemukan daftar direktori pencarian kompiler GCC Anda dengan menjalankannya dengan opsi -v.
Anda dapat menambahkan direktori tambahan ke jalur pencarian dengan menggunakan - I dir , yang menyebabkan dir untuk dicari setelah direktori saat ini (untuk bentuk kutipan dari direktif) dan di depan direktori sistem standar.
Pada dasarnya, bentuk "xxx" hanyalah pencarian di direktori saat ini; jika tidak ditemukan jatuh kembali formulir
sumber
#include "header.h"
formulir tidak akurat, @personal_cloud. Saya menganggap jawaban piCookie dan Yann Droneaud paling relevan ketika mereka mengidentifikasi dari mana informasi mereka berasal. Saya juga tidak menemukan jawaban terpilih sepenuhnya memuaskan.Ini
#include <filename>
digunakan ketika file sistem sedang dirujuk. Itu adalah file header yang dapat ditemukan di lokasi default sistem seperti/usr/include
atau/usr/local/include
. Untuk file Anda sendiri yang perlu dimasukkan dalam program lain, Anda harus menggunakan#include "filename"
sintaks.sumber
Idealnya, Anda akan menggunakan <...> untuk pustaka C standar dan "..." untuk pustaka yang Anda tulis dan ada di direktori saat ini.
sumber
Aturan umum yang sederhana adalah dengan menggunakan tanda kurung siku untuk memasukkan file header yang datang dengan kompiler. Gunakan tanda kutip ganda untuk memasukkan file header lainnya. Kebanyakan kompiler melakukannya dengan cara ini.
1.9 - File header menjelaskan lebih detail tentang arahan pra-prosesor. Jika Anda seorang programmer pemula, halaman itu seharusnya membantu Anda memahami semua itu. Saya mempelajarinya dari sini, dan saya telah mengikutinya di tempat kerja.
sumber
#include <filename>
digunakan ketika Anda ingin menggunakan file header dari sistem C / C ++ atau perpustakaan kompiler. Perpustakaan ini bisa berupa stdio.h, string.h, math.h, dll.
#include "path-to-file/filename"
digunakan ketika Anda ingin menggunakan file header kustom Anda sendiri yang ada di folder proyek Anda atau di tempat lain.
Untuk informasi lebih lanjut tentang preprosesor dan header. Baca C - Preprosesor .
sumber
#include <filename>
#include "filename"
#include <filename>
dan mencari file header di mana file header sistem disimpan.#include <filename>
.sumber
Untuk melihat urutan pencarian di sistem Anda menggunakan gcc, berdasarkan pada konfigurasi saat ini, Anda dapat menjalankan perintah berikut. Anda dapat menemukan detail lebih lanjut tentang perintah ini di sini
cpp -v /dev/null -o /dev/null
sumber
Termasuk file tempat direktori sertakan default.
Termasuk file di direktori saat ini di mana itu dikompilasi.
sumber
Ada dua cara untuk menulis pernyataan #include. Ini adalah:
Arti setiap bentuk adalah
Perintah ini akan mencari file
mylib.h
di direktori saat ini serta daftar direktori yang ditentukan seperti yang disebutkan di l sertakan jalur pencarian yang mungkin telah diatur.Perintah ini akan mencari file
mylib.h
dalam daftar direktori yang ditentukan saja.Jalur pencarian sertakan tidak lain adalah daftar direktori yang akan dicari file yang disertakan. Kompiler C yang berbeda memungkinkan Anda mengatur jalur pencarian dengan cara yang berbeda.
sumber