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