Computer >> คอมพิวเตอร์ >  >> การเขียนโปรแกรม >> C++

มาโครและตัวประมวลผลล่วงหน้าใน C


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