Preprocessor directives
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 ที่เราสามารถสร้างขึ้นมาเอง เพื่อให้ในสถานการณ์ที่เหมาะสมได้