Salah satu kesulitan dengan pengecualian duplikat-header otomatis adalah bahwa standar C relatif diam pada subjek apa yang termasuk nama file. Sebagai contoh, misalkan file utama yang dikompilasi berisi arahan #include "f1.h"
dan #include "f2.h"
, dan file yang ditemukan untuk arahan keduanya mengandung #include "f3.h"
. Jika f1.h
dan f2.h
berada di direktori yang berbeda, tetapi ditemukan dengan mencari path termasuk, maka akan menjadi tidak jelas #include
arahan dalam file tersebut dimaksudkan untuk memuat f3.h
file yang sama , atau yang berbeda.
Hal-hal menjadi lebih buruk jika seseorang menambahkan kemungkinan menyertakan file termasuk jalur relatif. Dalam beberapa kasus di mana file header menggunakan jalur relatif untuk arahan termasuk bersarang, dan di mana orang ingin menghindari membuat perubahan pada file header yang disediakan, mungkin perlu memiliki file header yang digandakan di beberapa tempat dalam struktur direktori proyek. Meskipun ada beberapa salinan fisik dari file header itu, mereka harus dianggap semantik seolah-olah mereka adalah file tunggal.
Jika #pragma once
direktif memungkinkan pengidentifikasi untuk mengikuti once
, dengan semantik bahwa kompiler harus melewatkan file jika pengidentifikasi cocok dengan satu dari #pragma once
direktif yang ditemui sebelumnya , maka semantik akan jelas; sebuah kompiler yang dapat memberi tahu bahwa suatu #include
arahan akan memuat #pragma once
file bertanda sama dengan yang sebelumnya, itu dapat menghemat sedikit waktu dengan melewatkan file tanpa membukanya lagi, tetapi deteksi tersebut tidak secara semantik penting karena file akan dilewati apakah atau tidak nama file dikenali sebagai kecocokan. Saya tidak mengetahui adanya kompiler yang bekerja seperti itu. Memiliki kompiler mengamati apakah file cocok dengan pola #ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
dan memperlakukan hal seperti itu setara dengan #pragma once someIdentifier
jika di atassomeIdentifier
tetap didefinisikan, pada dasarnya sama baiknya.
#pragma once
yang memberitahu kompiler untuk hanya memasukkan file itu sekali.