ปัญหาอย่างหนึ่งของการยกเว้นส่วนหัวที่ซ้ำกันโดยอัตโนมัติคือมาตรฐาน C ค่อนข้างเงียบในเรื่องของความหมายของชื่อไฟล์ ตัวอย่างเช่นสมมติว่าไฟล์หลักถูกรวบรวมมีคำสั่ง#include "f1.h"
และและพบไฟล์สำหรับคำสั่งเหล่านั้นทั้งสองมี#include "f2.h"
#include "f3.h"
หากf1.h
และf2.h
อยู่ในไดเรกทอรีที่แตกต่างกัน แต่ถูกค้นพบโดยการค้นหารวมถึงเส้นทางมันจะไม่ชัดเจนว่า#include
คำสั่งภายในไฟล์เหล่านั้นตั้งใจจะโหลดf3.h
ไฟล์เดียวกันหรือไฟล์อื่น
สิ่งต่าง ๆ แย่ลงไปอีกถ้ามีใครเพิ่มความเป็นไปได้ของไฟล์รวมถึงเส้นทางที่เกี่ยวข้อง ในบางกรณีที่ไฟล์ส่วนหัวใช้พา ธ สัมพัทธ์สำหรับคำสั่งซ้อนรวมถึงคำสั่งและหากใครต้องการหลีกเลี่ยงการเปลี่ยนแปลงใด ๆ กับไฟล์ส่วนหัวที่ให้มาอาจจำเป็นต้องมีไฟล์ส่วนหัวซ้ำในหลาย ๆ ที่ภายในโครงสร้างไดเรกทอรีของโครงการ แม้ว่าจะมีอยู่จริงหลายสำเนาของไฟล์ส่วนหัวที่มีอยู่พวกเขาควรจะถือความหมายราวกับว่าพวกเขาเป็นไฟล์เดียว
หาก#pragma once
คำสั่งอนุญาตให้ตัวระบุติดตามตามonce
ความหมายที่คอมไพเลอร์ควรข้ามไฟล์หากตัวระบุตรงกับตัวหนึ่งจาก#pragma once
คำสั่งที่พบก่อนหน้านี้ความหมายจะไม่มีความชัดเจน คอมไพเลอร์ซึ่งสามารถบอกได้ว่า#include
คำสั่งจะโหลด#pragma once
ไฟล์ -tagged เดียวกันกับไฟล์ก่อนหน้ามันสามารถประหยัดเวลาได้เล็กน้อยโดยการข้ามไฟล์โดยไม่เปิดอีกครั้ง แต่การตรวจจับดังกล่าวจะไม่สำคัญทางอรรถศาสตร์เนื่องจากไฟล์นั้นจะถูกข้ามหรือไม่ หรือไม่ใช่ชื่อไฟล์ที่ได้รับการยอมรับว่าเป็นการจับคู่ อย่างไรก็ตามฉันไม่ทราบว่าคอมไพเลอร์ตัวใดทำงานในลักษณะนั้น มีคอมไพเลอร์สังเกตว่าไฟล์ตรงกับรูปแบบ#ifndef someIdentifier / #define someIdentifier / #endif [for that ifndef] / nothing following
และการรักษาสิ่งนั้นเทียบเท่ากับข้างต้น#pragma once someIdentifier
ถ้าsomeIdentifier
ยังคงกำหนดเป็นหลักดี
#pragma once
ใดให้คอมไพเลอร์รวมไฟล์นั้นเพียงครั้งเดียว