Otomatik yinelenen başlık dışlamasıyla ilgili bir zorluk, C standardının dosya adlarının ne anlama geldiği konusunda nispeten sessiz olmasıdır. Örneğin, derlenen ana dosyanın yönergeler içerdiğini #include "f1.h"
ve #include "f2.h"
bu yönergeler için bulunan dosyaların her ikisinin de içerdiğini varsayalım #include "f3.h"
. Eğer f1.h
ve f2.h
farklı dizinlerde, ancak arama yaparak bulundu o zaman belirsiz olurdu yolları dahil #include
bu dosyaların içindeki yönergeler aynı yüklemek için amaçlanan edildi f3.h
dosyası veya farklı olanları.
Göreli yollar da dahil olmak üzere dosya ekleme olanaklarına eklenirse işler daha da kötüleşir. Üstbilgi dosyalarının iç içe yerleştirme için göreli yollar kullandığı bazı durumlarda ve bir kişinin sağlanan üstbilgi dosyalarında herhangi bir değişiklik yapmaktan kaçınması durumunda, bir üstbilgi dosyasının bir projenin dizin yapısı içinde birden çok yerde çoğaltılması gerekebilir. Bu başlık dosyasının birden çok fiziksel kopyası mevcut olsa da, bunlar semantik olarak tek bir dosya gibi değerlendirilmelidir.
Eğer #pragma once
yönerge takip etmek bir tanımlayıcı izin once
tanımlayıcı önceki bir-karşılaştı birini eşleşirse derleyici dosyayı atlamak gerektiğini semantik ile, #pragma once
yönerge, sonra semantik net olurdu; bir #include
direktifin aynı #pragma once
etiketli dosyayı daha önceki bir dosyayla yükleyeceğini söyleyebilen bir derleyici , dosyayı tekrar açmadan atlayarak biraz zaman kazandırabilir, ancak dosya atlanıp atlanmayacağı için böyle bir algılama semantik olarak önemli olmaz. veya dosya adı eşleşme olarak tanınmadı. Ancak bu şekilde çalışan herhangi bir derleyicinin farkında değilim. Bir derleyiciye sahip olmak, bir dosyanın kalıpla eşleşip eşleşmediğini gözlemleyin #ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
ve yukarıdaki gibi bir şeye yukarıdaki gibi #pragma once someIdentifier
davranınsomeIdentifier
tanımlı kalır, esasen iyidir.
#pragma once
, derleyiciye bu dosyayı yalnızca bir kez eklemesini söyleyen dosya vardır.