Preprocessor directives

8 September 2015

Preprocessor directives เป็นบรรทัดคำสั่งในโปรแกรมที่จะถูกประมวลผลก่อนที่คอมไพล์เลอร์จะทำงาน มันทำงานโดย Preprocessor และคำสั่งเหล่านี้จะต้องใส่เครื่องหมาย (#) นำหน้า ข้อแตกต่างจากคำสั่งปกติคือมันจะไม่มีเซมิโคลอน (;) หลังจากคำสั่ง เพราะว่ามันใช้การขึ้นบรรทัดใหม่เป็นตัวบ่งบอก แต่ถ้าเราต้องการให้มันอยู่ในบรรทัดเดียวกัน เราสามารถใช้เครื่องหมายขึ้นบรรทัดใหม่ได้ (/).

macro definitions (#define, #undef)

Marco definitions เป็นชุดของคำสั่งที่ใช้คำสั่ง define และ undef มีรูปแบบคือ:

#define identifier replacement

คำสั่งนี้ในแทนที่โค้ดของโปรแกรมที่ปรากฏเหมือน identifier และถ้าพบมันจะแทนที่โค้ดนั้นด้วย replacement ตัวอย่างเช่น:

#define SIZE 10
int number[SIZE];
int x = SIZE;

สังเกตุว่าคำสั่งนี้ไม่มีเซมิโคลอน และเราเห็นว่า SIZE นั้นเป็น identifier ของคำสั่งนี้ และ 10 เป็น replacement โดยมันจะค้นหาทุกโค้ดในโปรแกรมสำหรับ "SIZE" และแทนที่ด้วย "10" ดังนั้นโค้ดข้างบนจึงมีค่าเหมือนกันกับโค้ดต่อไปนี้

int number[10];
int x = 10;

เราสามารถยกเลิก (undefine) directives ใดๆ ที่เราสร้างไปโดยการใช้คำสั่ง undef ของ macro ตัวอย่างเช่น

#undef SIZE

Conditional inclusions (#ifdef, #ifndef, #if, #endif, #else and #elif)

Conditional inclusions เป็นคำสั่งที่ถูกใช้เพื่อตรวจสอบว่า Macro directives ได้ถูกสร้างก่อนหน้านี้แล้วหรือไม่ และไม่สำคัญไม่ว่าค่ามันจะเป็นอะไร

#ifdef ใช้เพื่อตรวจสอบ Marco identifier ที่ระบุ ถ้ามันถูกสร้างไว้ก่อนหน้า ถ้าเป็นจริงมันจะอนุญาติให้ส่วนของโค้ดคอมไพล์ได้ ถ้าไม่ใช่มันจะข้ามการคอมไพล์โค้ดส่วนนั้นไป ส่วนของโค้ดของคำสั่งหรือบล็อคคำสั่งของ directive จะจบด้วย #endif

#define SIZE 100
#ifdef SIZE
    int number[SIZE];
#endif;

และคำสั่งที่ทำงานตรงกันข้ามกับ #ifdef คือ #ifndef คำสั่งนี้จะตรวจสอบถ้า Marco ไม่ได้ถูกสร้างก่อนหน้า ถ้าเป็นจริงมันจะอนุญาติให้ส่วนของโค้ดคอมไพล์ ถ้าไม่มันจะข้ามไป

#ifndef SIZE
    #define SIZE 100
#endif;

คำสั่ง #if, #endif, #else และ #elif เพื่อที่จะตรวจสอบเงื่อนไขบางอย่างกับ Marco โดยที่ Expression สามารถที่จะเปรียบเทียบกับค่าคงที่ได้ มันทำงานเหมือนคำสั่ง if, else และ else ที่เราได้เรียนไปก่อนหน้านี้แล้ว

#if SIZE>100
#undef SIZE
#define SIZE 200

#elif SIZE<50
#undef SIZE
#define SIZE 50

#else
#undef SIZE
#define SIZE 100
#endif

int myarray[SIZE];

Line control (#line)

#line directive เป็นคำสั่งที่อนุญาติให้เราสามารถควบคุมว่าโปรแกรมจะแสดงข้อผิดพลาดอย่างไร โดยปกติ เมื่อมีข้อผิดพลาดเกิดขึ้นขณะการคอมไพล์ของโปรแกรม มันจะแสดงชื่อของไฟล์และบรรทัดที่ทำให้เกิดข้อผิดพลาดนั้น ดังนั้นเราสามารถเปลี่ยนชื่อไฟล์และบรรทัดที่เราต้องการจะให้มันแสดง รูปแบบของมันคือ:

 #line number "filename"

โดย number เป็นหมายเลขของบรรทัดที่อยู่ใต้คำสั่งนี้ และมันจะนับต่อจากบรรทัดนี้เพื่อให้สิ้นสุดไฟล์ ตัวอย่างเช่น:

#line 100 "my file name"
int n=;

Error directive (#error)

Error directive ถูกใช้เพื่อหยุดการคอมไพล์ในบางโอกาส มันมักจะถูกใช้กับ Conditional directives ถ้ามีเงื่อนไขที่ตรง

#ifndef SIZE
#error A macro SIZE must define to run the program!
#endif

Source file inclusion (#include)

Source file inclusion directive ถูกใช้เพื่อนำเข้า Header หรือไฟล์มายังไฟล์โปรแกรมปัจจุบัน คุณได้เห็นไปแล้วในบทก่อนหน้าของบทเรียนนี้ รูปแบบของมันคือ:

#include <header>
#include "filename"

#include directive จะแทนที่บรรทัดนั้นกับ Header หรือไฟล์ที่เรานำเข้ามา โดยไฟล์ Header จะต้องอยู่ในโฟล์เดอร์ของ Header ไฟล์

#include <iostream>
#include "myheader.h"

ในตัวอย่างนี้ คุณได้เห็นแล้วหลายครั้ง โดยอันแรกจะปิดด้วย <> นั่นหมายถึงไลบรารี่มาตรฐานของ iostream และอีกอันหนึ่งจะล้อมรอบด้วยเครื่องหมาย "" (Double quote) ซึ่งเป็นไฟล์ Header ที่เราสามารถสร้างขึ้นมาเอง เพื่อให้ในสถานการณ์ที่เหมาะสมได้

บทความนี้เป็นประโยชน์หรือไม่?Yes·No