C preprocessor
ส่วนหนึ่งของpreprocessor C ไม่ได้เป็นคอมไพเลอร์ แต่มันเป็นกระบวนการของการรวบรวมขั้นตอนที่แยกต่างหากในระยะสั้น, C preprocessor เป็นเพียงเครื่องมือเปลี่ยนตัวเฉพาะข้อความที่พวกเขาจะสั่งให้รวบรวมเพื่อรวบรวมการปรับสภาพที่สมบูรณ์ก่อนที่จะมีความต้องการที่แท้จริง เราจะ preprocessor C (C Preprocessor) ย่อว่า CPP
คำสั่งซื้อทั้งหมดเป็น pre-โปรเซสเซอร์ที่มีเครื่องหมายปอนด์ (#) ที่จุดเริ่มต้น มันจะต้องเป็นคนแรกที่อักขระที่ไม่ว่างเพื่อเพิ่มประสิทธิภาพในการอ่านคำสั่ง preprocessor ควรเริ่มต้นในคอลัมน์แรก ข้างล่างนี้เป็นทั้งหมดที่สำคัญคำแนะนำก่อนการประมวลผล:
指令 | 描述 |
---|---|
#define | 定义宏 |
#include | 包含一个源代码文件 |
#undef | 取消已定义的宏 |
#ifdef | 如果宏已经定义,则返回真 |
#ifndef | 如果宏没有定义,则返回真 |
#if | 如果给定条件为真,则编译下面代码 |
#else | #if 的替代方案 |
#elif | 如果前面的 #if 给定条件不为真,当前条件为真,则编译下面代码 |
#endif | 结束一个 #if……#else 条件编译块 |
#error | 当遇到标准错误时,输出错误消息 |
#pragma | 使用标准化方法,向编译器发布特殊的命令到编译器中 |
ตัวอย่างของการประมวลผลก่อน
การวิเคราะห์จะเข้าใจตัวอย่างต่อไปนี้คำแนะนำที่แตกต่างกัน
#define MAX_ARRAY_LENGTH 20
คำสั่งนี้จะบอก CPP เพื่อแทนที่ MAX_ARRAY_LENGTH ทั้งหมด 20 ใช้#defineการกำหนดค่าคงที่เพื่อเพิ่มการอ่าน
#include <stdio.h> #include "myheader.h"
คำแนะนำเหล่านี้บอก CPP stdio.hได้รับจากระบบห้องสมุดและเพิ่มข้อความไปยังแฟ้มมาในปัจจุบันบรรทัดถัดไปบอก CPPmyheader.h ได้รับจากไดเรกทอรีท้องถิ่นและเพิ่มเนื้อหาไปยังแฟ้มมาในปัจจุบัน
#undef FILE_SIZE #define FILE_SIZE 42
คำสั่งนี้จะบอก CPP ยกเลิก FILE_SIZE กำหนดและกำหนดเป็น 42
#ifndef MESSAGE #define MESSAGE "You wish!" #endif
คำสั่งนี้จะบอก CPP เฉพาะเมื่อมีข้อความไม่ได้กำหนดเฉพาะเมื่อกำหนด MESSAGE
#ifdef DEBUG /* Your debugging statements here */ #endif
คำสั่งนี้จะบอก CPP หากคุณกำหนด DEBUG แล้วดำเนินการประมวลผลคำสั่ง ที่รวบรวมเวลาถ้าคุณผ่านสวิทช์-DDEBUGเรียบเรียง GCC คำสั่งนี้จะเป็นประโยชน์ มันกำหนด DEBUG คุณสามารถเปิดหรือปิดการแก้จุดบกพร่องในระหว่างการรวบรวม
แมโครที่กำหนดไว้ล่วงหน้า
ANSI C กำหนดจำนวนของแมโคร ในการเขียนโปรแกรมคุณสามารถใช้แมโครเหล่านี้ แต่ที่แตกต่างกันในการปรับเปลี่ยนโดยตรงแมโครที่กำหนดไว้ล่วงหน้าเหล่านี้
宏 | 描述 |
---|---|
__DATE__ | 当前日期,一个以 "MMM DD YYYY" 格式表示的字符常量。 |
__TIME__ | 当前时间,一个以 "HH:MM:SS" 格式表示的字符常量。 |
__FILE__ | 这会包含当前文件名,一个字符串常量。 |
__LINE__ | 这会包含当前行号,一个十进制常量。 |
__STDC__ | 当编译器以 ANSI 标准编译时,则定义为 1。 |
ลองตัวอย่างต่อไปนี้:
#include <stdio.h> 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__ ); }
เมื่อโค้ดข้างต้น (ในtest.c ไฟล์) เป็นข้อมูลที่รวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
File :test.c Date :Jun 2 2012 Time :03:36:24 Line :8 ANSI :1
ผู้ประกอบการ preprocessor
C preprocessor ให้ผู้ประกอบการดังต่อไปนี้จะช่วยให้คุณสร้างแมโคร:
ความต่อเนื่องของผู้ประกอบการมาโคร (\)
แมโครมักจะเขียนในบรรทัดเดียว แต่ถ้าแมโครยาวเกินไปที่จะใส่ในบรรทัดเดียวให้ใช้ความต่อเนื่องของผู้ประกอบการแมโคร (\) ตัวอย่างเช่น:
#define message_for(a, b) \ printf(#a " and " #b ": We love you!\n")
ผู้ประกอบการสตริงตัวอักษรควอน (#)
ในนิยามแมโครเมื่อคุณจำเป็นต้องใส่อาร์กิวเมนต์แมโครเป็นค่าคงที่สตริงสตริงประกอบ quantization คงที่ (#) Macro ใช้ประกอบการที่มีพารามิเตอร์หรือพารามิเตอร์รายการที่เฉพาะเจาะจง ตัวอย่างเช่น:
#include <stdio.h> #define message_for(a, b) \ printf(#a " and " #b ": We love you!\n") int main(void) { message_for(Carole, Debra); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Carole and Debra: We love you!
ผู้ประกอบการวางโทเค็น (##)
ผู้ประกอบการวางโทเค็น (##) ตามคำนิยามของแมโครจะผสานสองพารามิเตอร์ จะช่วยให้สองแท็กคำนิยามแมโครอิสระจะรวมกันเป็นแท็ก ตัวอย่างเช่น:
#include <stdio.h> #define tokenpaster(n) printf ("token" #n " = %d", token##n) int main(void) { int token34 = 40; tokenpaster(34); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
token34 = 40
นี่คือวิธีที่มันเกิดขึ้นเพราะตัวอย่างนี้จะผลิตผลผลิตที่เกิดขึ้นจริงต่อไปนี้จากคอมไพเลอร์:
printf ("token34 = %d", token34);
ตัวอย่างนี้แสดงให้เห็นถึงสัญญาณ ## n เชื่อมต่อกับ token34ในที่นี่เราใช้สตริงประกอบการคงควอน (#) และผู้ประกอบการวางโทเค็น(##)
ที่กำหนดไว้ () ผู้ประกอบการ
ผู้ประกอบการ preprocessorกำหนดจะใช้ในการแสดงออกคงที่ที่ใช้ในการตรวจสอบว่ามีตัวบ่งชี้ได้ถูกกำหนดให้ใช้ #defineหากระบุที่ระบุถูกกำหนดไว้แล้วค่าที่เป็นจริง (ไม่ใช่ศูนย์) หากระบุที่ระบุไม่ได้ถูกกำหนดค่าเป็นเท็จ (ศูนย์) ตัวอย่างต่อไปนี้แสดงให้เห็นถึงที่กำหนดไว้ () ใช้ประกอบการ:
#include <stdio.h> #if !defined (MESSAGE) #define MESSAGE "You wish!" #endif int main(void) { printf("Here is the message: %s\n", MESSAGE); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Here is the message: You wish!
แมโคร parameterized
CPP เป็นคุณลักษณะที่มีประสิทธิภาพสามารถนำมาใช้ในการจำลองการทำงานของแมโครแปร ตัวอย่างเช่นรหัสต่อไปนี้คือการคำนวณตารางของตัวเลข:
int square(int x) { return x * x; }
เราสามารถใช้แมโครเพื่อเขียนโค้ดข้างต้นดังต่อไปนี้:
#define square(x) ((x) * (x))
ก่อนที่จะใช้แมโครกับพารามิเตอร์ที่คุณต้องใช้คำสั่ง #defineรายการพารามิเตอร์ในวงเล็บและต้องเป็นทันทีหลังชื่อแมโคร ช่องว่างระหว่างชื่อมหภาคและวงเล็บไม่ได้รับอนุญาต ตัวอย่างเช่น:
#include <stdio.h> #define MAX(x,y) ((x) > (y) ? (x) : (y)) int main(void) { printf("Max between 20 and 10 is %d\n", MAX(10, 20)); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Max between 20 and 10 is 20