C Preprocessor ไม่ได้เป็นส่วนหนึ่งของคอมไพเลอร์ แต่เป็นขั้นตอนที่แยกต่างหากในกระบวนการคอมไพล์ พูดง่ายๆ ว่า C Preprocessor เป็นเพียงเครื่องมือแทนที่ข้อความ และสั่งให้คอมไพเลอร์ทำการประมวลผลล่วงหน้าที่จำเป็นก่อนการคอมไพล์จริง เราจะเรียกตัวประมวลผลล่วงหน้า C ว่า CPP
คำสั่งตัวประมวลผลล่วงหน้าทั้งหมดเริ่มต้นด้วยสัญลักษณ์แฮช (#) ต้องเป็นอักขระที่ไม่เว้นว่างตัวแรก และเพื่อให้สามารถอ่านได้ คำสั่งตัวประมวลผลล่วงหน้าควรเริ่มต้นในคอลัมน์แรก ส่วนต่อไปนี้แสดงรายการคำสั่งพรีโปรเซสเซอร์ที่สำคัญทั้งหมด -
| Sr.No | คำสั่ง &คำอธิบาย |
|---|---|
| 1 | #define แทนที่มาโครตัวประมวลผลล่วงหน้า |
| 2 | #include แทรกส่วนหัวเฉพาะจากไฟล์อื่น |
| 3 | #undef ยกเลิกการกำหนดมาโครตัวประมวลผลล่วงหน้า |
| 4 | #ifdef ส่งกลับค่าจริงหากมีการกำหนดมาโครนี้ |
| 5 | #ifndef คืนค่า จริง หากไม่ได้กำหนดมาโครนี้ |
| 6 | #if ทดสอบว่าเงื่อนไขเวลาคอมไพล์เป็นจริงหรือไม่ |
| 7 | #else ทางเลือกสำหรับ #if |
| 8 | #elif #else และ #if ในประโยคเดียว |
| 9 | #endif สิ้นสุดเงื่อนไขตัวประมวลผลล่วงหน้า |
| 10 | #error พิมพ์ข้อความแสดงข้อผิดพลาดบน stderr |
| 11 | #pragma ออกคำสั่งพิเศษให้กับคอมไพเลอร์โดยใช้วิธีการมาตรฐาน |
ตัวอย่างบางส่วนของตัวประมวลผลล่วงหน้า -
วิเคราะห์ตัวอย่างต่อไปนี้เพื่อทำความเข้าใจคำสั่งต่างๆ
#define MAX_ARRAY_LENGTH 20
คำสั่งนี้บอกให้ CPP แทนที่อินสแตนซ์ของ MAX_ARRAY_LENGTH ด้วย 20 ใช้ #define สำหรับค่าคงที่เพื่อเพิ่มความสามารถในการอ่าน
#include <stdio.h> #include "myheader.h"
คำสั่งเหล่านี้บอกให้ CPP รับ stdio.h จาก System Libraries และเพิ่มข้อความลงในไฟล์ต้นฉบับปัจจุบัน บรรทัดถัดไปบอกให้ CPP รับ myheader.h จากไดเร็กทอรีในเครื่องและเพิ่มเนื้อหาลงในไฟล์ต้นฉบับปัจจุบัน
#undef FILE_SIZE #define FILE_SIZE 42
มันบอกให้ CPP กำหนด FILE_SIZE ที่มีอยู่และกำหนดเป็น 42
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
มันบอกให้ CPP กำหนด MESSAGE ก็ต่อเมื่อยังไม่ได้กำหนด MESSAGE ไว้
#ifdef DEBUG /* Your debugging statements here */ #endif
มันบอกให้ CPP ประมวลผลข้อความที่แนบมาหากมีการกำหนด DEBUG สิ่งนี้มีประโยชน์หากคุณส่งแฟล็ก -DDEBUG ไปยังคอมไพเลอร์ gcc ในขณะที่คอมไพล์ สิ่งนี้จะกำหนด DEBUG ดังนั้นคุณจึงสามารถเปิดและปิดการดีบักได้ทันทีในระหว่างการคอมไพล์
มาโครที่กำหนดไว้ล่วงหน้า -
ANSI C กำหนดมาโครจำนวนหนึ่ง แม้ว่าแต่ละอันจะพร้อมใช้งานในการเขียนโปรแกรม แต่มาโครที่กำหนดไว้ล่วงหน้าไม่ควรแก้ไขโดยตรง
| Sr.No | มาโคร &คำอธิบาย |
|---|---|
| 1 | __DATE__ วันที่ปัจจุบันเป็นตัวอักษรในรูปแบบ "MMM DD YYYY" |
| 2 | __TIME__ เวลาปัจจุบันตามตัวอักษรในรูปแบบ "HH:MM:SS" |
| 3 | __FILE__ ซึ่งมีชื่อไฟล์ปัจจุบันเป็นสตริงตามตัวอักษร |
| 4 | __LINE__ ซึ่งมีหมายเลขบรรทัดปัจจุบันเป็นค่าคงที่ทศนิยม |
| 5 | __STDC__ กำหนดเป็น 1 เมื่อคอมไพเลอร์เป็นไปตามมาตรฐาน ANSI |
ตัวอย่าง
#include <stdio.h>
int main() {
printf("File :%s\n", __FILE__ );
printf("Date :%s\n", __DATE__ );
printf("Time :%s\n", __TIME__ );
printf("Line :%d\n", __LINE__ );
printf("ANSI :%d\n", __STDC__ );
} ผลลัพธ์
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1