c ++ preprocessor
บางคนสั่ง preprocessor ชี้นำ preprocessor เพื่อคอมไพเลอร์ก่อนที่จะรวบรวมจริงที่คุณต้องดำเนินการ
ทุกคำสั่ง preprocessor คือ (#) เริ่มต้นด้วยเครื่องหมายปอนด์เท่านั้นอักขระช่องว่างอาจจะปรากฏก่อนสั่งพรีโพรเซสเซอร์ c ++ สั่ง preprocessor ไม่ได้เป็นคำสั่งเพื่อให้พวกเขาไม่ได้อัฒภาคที่สิ้นสุด ()
เราได้เห็นทุกกรณีก่อนหน้านี้มีคำสั่ง#includeแมโครนี้จะใช้ไฟล์ส่วนหัวจะรวมอยู่ในแฟ้มแหล่งที่มา
c ++ นอกจากนี้ยังสนับสนุนจำนวนสั่งประมวลผลเบื้องต้นเช่น # include # กำหนด # ถ้า # อื่น # บรรทัด ฯลฯ ให้เราดูที่คำแนะนำที่สำคัญเหล่านี้
preprocessing #define
#define preprocessor สั่งใช้ในการสร้างค่าคงที่สัญลักษณ์คงสัญลักษณ์มักจะเรียกว่าแมโครรูปแบบของคำสั่งทั่วไปคือ
#define macro-name replacement-text
เมื่อบรรทัดของรหัสนี้ปรากฏขึ้นในไฟล์ไฟล์ที่ปรากฏในภายหลังแมโครทั้งหมดจะถูกแทนที่ด้วยการเปลี่ยนข้อความก่อนที่โปรแกรมจะรวบรวม ตัวอย่างเช่น:
#include <iostream> using namespace std; #define PI 3.14159 int main () { cout << "Value of PI :" << PI << endl; return 0; }
ตอนนี้ขอทดสอบรหัสนี้จะดูที่ผลของการปรับสภาพได้ สมมติว่าแฟ้มแหล่งที่มาที่มีอยู่แล้วให้ใช้ตัวเลือก -E ในการรวบรวมและการเปลี่ยนเส้นทางผลให้ test.p. ตอนนี้ถ้าคุณดูไฟล์ test.p คุณจะเห็นว่ามันมีอยู่แล้วมีข้อมูลจำนวนมากและความคุ้มค่าการเปลี่ยนแปลงในด้านล่างของไฟล์ดังต่อไปนี้:
$gcc -E test.cpp > test.p ... int main () { cout << "Value of PI :" << 3.14159 << endl; return 0; }
ฟังก์ชั่นมาโคร
คุณสามารถใช้ #define เพื่อกำหนดแมโครดังต่อไปนี้ด้วยพารามิเตอร์:
#include <iostream> using namespace std; #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; cout <<"The minimum is " << MIN(i, j) << endl; return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
The minimum is 30
รวบรวมเงื่อนไข
มีหลายคำสั่งที่สามารถใช้ในการคัดเลือกในส่วนของรหัสที่มาโปรแกรมจะรวบรวมเป็น กระบวนการนี้เป็นที่รู้จักกันรวบรวมเงื่อนไข
โครงสร้างและการเลือกหากเงื่อนไขโครงสร้างเหมือนพรีโพรเซสเซอร์ พิจารณารหัสทาง preprocessor ต่อไปนี้:
#ifndef NULL #define NULL 0 #endif
คุณสามารถทำเฉพาะเมื่อรวบรวมกับการแก้จุดบกพร่องแก้จุดบกพร่องที่สามารถรับรู้การใช้แมโครดังต่อไปนี้:
#ifdef DEBUG cerr <<"Variable x = " << x << endl; #endif
ถ้าก่อนหน้านี้การเรียนการสอน #ifdef ดีบักได้รับการกำหนดสัญลักษณ์คง DEBUG มันจะอยู่ในงบโปรแกรมcerr ที่รวบรวมคุณสามารถใช้ #if 0 ความคิดเห็นจากส่วนคำสั่งของโปรแกรมดังต่อไปนี้:
#if 0 不进行编译的代码 #endif
ลองตัวอย่างต่อไปนี้:
#include <iostream> using namespace std; #define DEBUG #define MIN(a,b) (((a)<(b)) ? a : b) int main () { int i, j; i = 100; j = 30; #ifdef DEBUG cerr <<"Trace: Inside main function" << endl; #endif #if 0 /* 这是注释部分 */ cout << MKSTR(HELLO C++) << endl; #endif cout <<"The minimum is " << MIN(i, j) << endl; #ifdef DEBUG cerr <<"Trace: Coming out of main function" << endl; #endif return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Trace: Inside main function The minimum is 30 Trace: Coming out of main function
# ## และผู้ประกอบการ
# ## และผู้ประกอบการประมวลผลเบื้องต้นใน C ++ และ ANSI / ISO ซีในก็สามารถใช้ได้ # Operator โทเค็นการเปลี่ยนข้อความจะถูกแปลงเป็นสตริงในเครื่องหมายอัญประกาศ
พิจารณาคำนิยามแมโครต่อไปนี้:
#include <iostream> using namespace std; #define MKSTR( x ) #x int main () { cout << MKSTR(HELLO C++) << endl; return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
HELLO C++
ลองมาดูวิธีการทำงาน ทุ่มเท, C ++ preprocessor บรรทัดต่อไปนี้:
cout << MKSTR(HELLO C++) << endl;
แปลงเป็น:
cout << "HELLO C++" << endl;
## ผู้ประกอบการที่ใช้ในการเชื่อมต่อสองราชสกุล นี่คือตัวอย่าง:
#define CONCAT( x, y ) x ## y
เมื่อ CONCAT ปรากฏในโปรแกรมพารามิเตอร์จะถูกเชื่อมโยงและใช้เพื่อแทนที่แมโคร ตัวอย่างเช่นโปรแกรม CONCAT (สวัสดี, C ++) จะถูกแทนที่ด้วย "Hello c ++" ดังแสดงในตัวอย่างต่อไปนี้
#include <iostream> using namespace std; #define concat(a, b) a ## b int main() { int xy = 100; cout << concat(x, y); return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
100
ลองมาดูวิธีการทำงาน ทุ่มเท, C ++ preprocessor บรรทัดต่อไปนี้:
cout << concat(x, y);
แปลงเป็น:
cout << xy;
c ++ แมโครที่กำหนดไว้ล่วงหน้า
c ++ ที่ระบุไว้ในตารางด้านล่างแมโครที่กำหนดไว้ล่วงหน้าบางส่วน:
宏 | 描述 |
---|---|
__LINE__ | 这会在程序编译时包含当前行号。 |
__FILE__ | 这会在程序编译时包含当前文件名。 |
__DATE__ | 这会包含一个形式为 month/day/year 的字符串,它表示把源文件转换为目标代码的日期。 |
__TIME__ | 这会包含一个形式为 hour:minute:second 的字符串,它表示程序被编译的时间。 |
ให้เราดูที่เหล่านี้ตัวอย่างแมโคร:
#include <iostream> using namespace std; int main () { cout << "Value of __LINE__ : " << __LINE__ << endl; cout << "Value of __FILE__ : " << __FILE__ << endl; cout << "Value of __DATE__ : " << __DATE__ << endl; cout << "Value of __TIME__ : " << __TIME__ << endl; return 0; }
เมื่อโค้ดข้างต้นจะรวบรวมและดำเนินการก็จะก่อให้เกิดผลลัพธ์ต่อไปนี้:
Value of __LINE__ : 6 Value of __FILE__ : test.cpp Value of __DATE__ : Feb 28 2011 Value of __TIME__ : 18:52:48