ดูเหมือนจะมีความสับสนมากมายเกี่ยวกับพรีโปรเซสเซอร์
สิ่งที่คอมไพเลอร์ทำเมื่อเห็น#include
ว่ามันแทนที่บรรทัดนั้นด้วยเนื้อหาของไฟล์ที่รวมไว้ไม่มีการถามคำถาม
ดังนั้นหากคุณมีไฟล์ที่a.h
มีเนื้อหานี้:
typedef int my_number;
และไฟล์ที่b.c
มีเนื้อหานี้:
#include "a.h"
#include "a.h"
ไฟล์b.c
จะถูกแปลโดยตัวประมวลผลก่อนก่อนที่จะรวบรวม
typedef int my_number;
typedef int my_number;
ซึ่งจะส่งผลให้เกิดข้อผิดพลาดในการรวบรวมเนื่องจากประเภทที่my_number
กำหนดไว้สองครั้ง แม้ว่าคำจำกัดความจะเหมือนกัน แต่ไม่อนุญาตให้ใช้ภาษา C
เนื่องจากส่วนหัวมักจะใช้ในมากกว่าหนึ่งสถานที่รวมถึงยามมักจะใช้ใน C. นี้มีลักษณะเช่นนี้:
#ifndef _a_h_included_
#define _a_h_included_
typedef int my_number;
#endif
ไฟล์b.c
จะยังคงมีเนื้อหาทั้งหมดของส่วนหัวในนั้นสองครั้งหลังจากถูกประมวลผลล่วงหน้า แต่อินสแตนซ์ที่สองจะถูกละเว้นเนื่องจากแมโคร_a_h_included_
จะถูกกำหนดไว้แล้ว
วิธีนี้ใช้งานได้ดี แต่มีข้อเสียสองประการ ก่อนอื่นต้องเขียนยามรวมและชื่อแมโครจะต้องแตกต่างกันในทุกส่วนหัว และประการที่สองคอมไพเลอร์ยังคงมองหาไฟล์ส่วนหัวและอ่านได้บ่อยเท่าที่มันรวมอยู่
Objective-C มี#import
คำสั่ง preprocessor (สามารถใช้กับรหัส C และ C ++ พร้อมคอมไพเลอร์และตัวเลือกบางตัว) สิ่งนี้เกือบจะเหมือนกัน#include
แต่ยังบันทึกภายในไฟล์ที่รวมอยู่แล้ว #import
สายจะถูกแทนที่โดยเฉพาะเนื้อหาของไฟล์ที่มีชื่อเป็นครั้งแรกที่จะพบ ทุกครั้งหลังจากนั้นมันก็จะถูกละเว้น