ดูเหมือนจะมีความสับสนมากมายเกี่ยวกับพรีโปรเซสเซอร์
สิ่งที่คอมไพเลอร์ทำเมื่อเห็น#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สายจะถูกแทนที่โดยเฉพาะเนื้อหาของไฟล์ที่มีชื่อเป็นครั้งแรกที่จะพบ ทุกครั้งหลังจากนั้นมันก็จะถูกละเว้น