Pertanyaan Apa perbedaan antara #include dan #include "filename"?


Dalam bahasa pemrograman C dan C ++, apa perbedaan antara menggunakan kurung sudut dan menggunakan tanda kutip di include pernyataan, sebagai berikut?

  1. #include <filename> 
  2. #include "filename"

1809
2017-08-22 01:40


asal


Jawaban:


Dalam prakteknya, perbedaannya adalah di lokasi di mana preprocessor mencari file yang disertakan.

Untuk #include <filename> preprocessor mencari dalam cara yang tergantung pada implementasi, biasanya dalam direktori pencarian yang ditentukan sebelumnya oleh compiler / IDE. Metode ini biasanya digunakan untuk menyertakan file header perpustakaan standar.

Untuk #include "filename" preprocessor mencari pertama di direktori yang sama dengan file yang berisi direktif, dan kemudian mengikuti jalur pencarian yang digunakan untuk #include <filename> bentuk. Metode ini biasanya digunakan untuk menyertakan file header yang ditentukan programmer.

Deskripsi yang lebih lengkap tersedia di GCC dokumentasi di jalur pencarian.


1045
2017-08-22 01:40



Satu-satunya cara untuk mengetahui adalah membaca dokumentasi implementasi Anda.

Di standar C, bagian 6.10.2, paragraf 2 hingga 4 menyatakan:

  • Arahan preprocessing dari formulir

    #include <h-char-sequence> new-line
    

    mencari urutan tempat yang ditentukan oleh implementasi untuk header yang diidentifikasi secara unik oleh urutan yang ditentukan antara < dan > pembatas, dan menyebabkan penggantian direktif oleh seluruh isi header. Bagaimana tempat ditentukan atau header yang diidentifikasi didefinisikan oleh implementasi.

  • Arahan preprocessing dari formulir

    #include "q-char-sequence" new-line
    

    menyebabkan penggantian direktif oleh seluruh isi file sumber yang diidentifikasi oleh urutan tertentu antara " pembatas. File sumber yang dinamai dicari dengan cara yang ditentukan oleh implementasi. Jika pencarian ini tidak didukung, atau jika pencarian gagal, arahan diproses ulang seolah-olah dibaca

    #include <h-char-sequence> new-line
    

    dengan urutan yang terkandung identik (termasuk > karakter, jika ada) dari aslinya   direktif.

  • Arahan preprocessing dari formulir

    #include pp-tokens new-line
    

    (yang tidak sesuai dengan salah satu dari dua bentuk sebelumnya) diizinkan. Token preprocessing setelah include dalam arahan diproses seperti dalam teks normal. (Setiap identifier yang saat ini didefinisikan sebagai nama makro diganti dengan daftar penggantinya berupa token preprocessing.) Arahan yang dihasilkan setelah semua penggantian harus sesuai dengan salah satu dari dua bentuk sebelumnya. Metode dimana urutan token preprocessing antara < dan a > preprocessing token pair atau sepasang " karakter digabungkan menjadi token nama header tunggal preprocessing adalah implementasi-didefinisikan.

Definisi:

  • h-char: setiap anggota dari set karakter sumber kecuali karakter baris baru dan >

  • q-char: setiap anggota dari set karakter sumber kecuali karakter baris baru dan "


594
2017-09-16 21:06



Urutan karakter antara <dan> secara unik mengacu pada sebuah header, yang belum tentu sebuah file. Implementasinya cukup bebas untuk menggunakan urutan karakter sesuai keinginannya. (Sebagian besar, bagaimanapun, hanya memperlakukannya sebagai nama file dan melakukan pencarian di termasuk jalan, seperti negara posting lainnya.)

Jika itu #include "file" form digunakan, implementasi pertama mencari file dari nama yang diberikan, jika didukung. Jika tidak (didukung), atau jika pencarian gagal, implementasi akan berfungsi seperti yang lainnya (#include <file>) formulir digunakan.

Juga, bentuk ketiga ada dan digunakan ketika #include direktif tidak cocok dengan formulir di atas. Dalam bentuk ini, beberapa preprocessing dasar (seperti ekspansi makro) dilakukan pada "operan" dari #include direktif, dan hasilnya diharapkan untuk mencocokkan salah satu dari dua bentuk lainnya.


214
2017-09-08 17:43



Beberapa jawaban yang bagus di sini membuat referensi ke standar C tetapi lupa standar POSIX, terutama perilaku spesifik dari c99 (mis. C compiler) perintah.

Menurut Spesifikasi Dasar Grup Terbuka Issue 7,

-SAYA  direktori

Ubah algoritme untuk mencari header yang namanya bukan nama path absolut untuk mencari di direktori yang dinamai oleh direktori pathname sebelum mencari di tempat biasa. Jadi, header yang namanya diapit oleh tanda kutip ganda ("") harus dicari untuk pertama kali di direktori file dengan #include baris, kemudian di direktori bernama di -SAYA pilihan, dan terakhir di tempat biasa. Untuk header yang namanya diapit kurung sudut ("<>"), header harus dicari hanya dalam direktori yang disebut -SAYA pilihan dan kemudian di tempat biasa. Direktori yang disebutkan dalam -SAYA opsi harus dicari dalam urutan yang ditentukan. Implementasi harus mendukung setidaknya sepuluh contoh dari opsi ini dalam satu c99 permintaan perintah.

Jadi, dalam lingkungan yang mendukung POSIX, dengan compiler C compiler POSIX, #include "file.h" kemungkinan akan mencari ./file.h pertama, dimana . adalah direktori tempat file dengan #include pernyataan, sementara #include <file.h>, kemungkinan akan mencari /usr/include/file.h pertama, dimana /usr/include adalah sistem Anda didefinisikan tempat-tempat biasa untuk header (sepertinya tidak ditentukan oleh POSIX).


92
2017-07-20 09:29



Itu:

"mypath/myfile" is short for ./mypath/myfile

dengan . menjadi salah satu direktori file di mana #include terkandung dalam, dan / atau direktori kerja saat ini dari compiler, dan / atau default_include_paths

dan

<mypath/myfile> is short for <defaultincludepaths>/mypath/myfile

Jika ./ dalam <default_include_paths>, maka tidak ada bedanya.

Jika mypath/myfile di direktori lain termasuk, perilaku tidak terdefinisi.


36
2018-02-08 11:45



Dokumentasi GCC mengatakan berikut tentang perbedaan antara keduanya:

File header pengguna dan sistem disertakan menggunakan perintah preprocessing ‘#include’. Ini memiliki dua varian:

#include <file>

Varian ini digunakan untuk file header sistem. Ini mencari file bernama file dalam daftar standar direktori sistem. Anda dapat menambahkan direktori ke daftar ini dengan -I pilihan (lihat Doa).

#include "file"

Varian ini digunakan untuk file header dari program Anda sendiri. Ini mencari file yang bernama file pertama di direktori yang berisi file saat ini, kemudian di direktori kutipan dan kemudian direktori yang sama digunakan untuk <file>. Anda dapat menambahkan direktori ke daftar direktori kutipan dengan -iquote pilihan.     Argumen tentang ‘#include’, apakah dibatasi dengan tanda kutip atau tanda kurung siku, berperilaku seperti string konstan dalam komentar yang tidak dikenali, dan nama makro tidak diperluas. Demikian, #include <x/*y> menentukan penyertaan file header sistem bernama x/*y.

Namun, jika backslash terjadi di dalam file, mereka dianggap sebagai karakter teks biasa, bukan karakter escape. Tak satu pun dari urutan escape karakter yang sesuai dengan konstanta string dalam C diproses. Demikian,#include "x\n\\y"menentukan nama file yang berisi tiga backslashes. (Beberapa sistem menafsirkan ‘\’ sebagai pemisah pathname. Semua ini juga menafsirkan ‘/’ cara yang sama. Ini paling portabel untuk digunakan saja ‘/’.)

Ini adalah kesalahan jika ada sesuatu (selain komentar) pada baris setelah nama file.


30
2018-01-14 04:52



Itu <file> termasuk memberitahu preprocessor untuk mencari -I direktori dan dalam direktori yang telah ditentukan pertama, lalu di direktori file .c. Itu "file" termasuk memberitahu preprocessor untuk mencari direktori file sumber pertama, dan kemudian kembali ke -I dan telah ditentukan sebelumnya. Semua tujuan dicari, hanya urutan pencarian yang berbeda.

Standar 2011 sebagian besar membahas file termasuk dalam "16.2 Sumber file inklusi".

2 Arahan preprocessing dari formulir

# include <h-char-sequence> new-line

mencari urutan tempat yang ditentukan oleh implementasi untuk header yang diidentifikasi secara unik oleh   urutan tertentu antara <dan> pembatas, dan menyebabkan   penggantian direktif itu oleh seluruh isi header.   Bagaimana tempat ditentukan atau header yang diidentifikasi   implementasi yang ditentukan.

3 Arahan preprocessing dari formulir

# include "q-char-sequence" new-line

menyebabkan penggantian direktif oleh seluruh isi file sumber yang diidentifikasi oleh   Urutan tertentu antara "pembatas. File sumber bernama adalah   dicari dengan cara yang ditentukan oleh implementasi. Jika pencarian ini   tidak didukung, atau jika pencarian gagal, direktif diproses ulang sebagai   jika dibaca

# include <h-char-sequence> new-line

dengan urutan yang terkandung identik (termasuk> karakter, jika ada) dari arahan asli.

Perhatikan itu "xxx" bentuk menurunkan menjadi <xxx> terbentuk jika file tidak ditemukan. Sisanya adalah implementasi yang ditentukan.


23
2017-09-03 12:17



Menurut standar - ya, mereka berbeda:

  • Arahan preprocessing dari formulir

    #include <h-char-sequence> new-line
    

    mencari urutan tempat yang ditentukan oleh implementasi untuk header yang diidentifikasi secara unik oleh urutan yang ditentukan antara < dan > pembatas, dan menyebabkan penggantian direktif oleh seluruh isi header. Bagaimana tempat ditentukan atau header yang diidentifikasi didefinisikan oleh implementasi.

  • Arahan preprocessing dari formulir

    #include "q-char-sequence" new-line
    

    menyebabkan penggantian direktif oleh seluruh isi file sumber yang diidentifikasi oleh urutan tertentu antara " pembatas. File sumber yang dinamai dicari dengan cara yang ditentukan oleh implementasi. Jika pencarian ini tidak didukung, atau jika pencarian gagal, arahan diproses ulang seolah-olah dibaca

    #include <h-char-sequence> new-line
    

    dengan urutan yang terkandung identik (termasuk > karakter, jika ada) dari aslinya   direktif.

  • Arahan preprocessing dari formulir

    #include pp-tokens new-line
    

    (yang tidak sesuai dengan salah satu dari dua bentuk sebelumnya) diizinkan. Token preprocessing setelah include dalam arahan diproses seperti dalam teks normal. (Setiap identifier yang saat ini didefinisikan sebagai nama makro diganti dengan daftar penggantinya berupa token preprocessing.) Arahan yang dihasilkan setelah semua penggantian harus sesuai dengan salah satu dari dua bentuk sebelumnya. Metode dimana urutan token preprocessing antara < dan a > preprocessing token pair atau sepasang " karakter digabungkan menjadi token nama header tunggal preprocessing adalah implementasi-didefinisikan.

Definisi:

  • h-char: setiap anggota dari set karakter sumber kecuali karakter baris baru dan >

  • q-char: setiap anggota dari set karakter sumber kecuali karakter baris baru dan "

Perhatikan bahwa standar tidak memberi tahu hubungan apa pun antara tata cara yang ditentukan oleh implementasi. Pencarian formulir pertama dalam satu cara yang ditentukan oleh implementasi, dan yang lainnya dengan cara yang ditentukan oleh implementasi (mungkin lainnya). Standar ini juga menetapkan bahwa file-file termasuk tertentu harus ada (misalnya, <stdio.h>).

Secara formal Anda harus membaca manual untuk compiler Anda, namun biasanya (berdasarkan tradisi) #include "..." form pencarian direktori dari file yang mana #include ditemukan pertama, dan kemudian direktori yang #include <...> pencarian formulir (jalur include, misalnya header sistem).


16
2017-08-18 06:21