Preprocessor directives
Preprocessor directives เป็นบรรทัดของโปรแกรมที่จะถูกประมวลผลโดย processor ก่อนที่โปรแกรมจะได้รับการคอมไพล์ โดยชุดคำสั่งนั้นจะขึ้นต้นด้วยเครื่องหมาย hash (#) ข้อแตกต่างเล็กๆ จากคำสั่งปกติคือจะไม่มีเครื่องหมาย semicolon (;) เมื่อสิ้นสุดคำสั่ง เพราะว่ามันใช้การขึ้นบรรทัดใหม่ในการบอกการสิ้นสุดของคำสั่งแทน แต่ถ้าคุณต้องการเขียนในบรรทัดเดียวกันสามารถใช้เครื่องหมาย new line (/)
macro definitions (#define, #undef)
macro definitions เป็นชุดคำสั่งที่ใช้คำสั่ง #define และ #undef คำสั่งเหล่านี้ทำงานโดย preprocessor โดยมีรูปแบบการใช้งานคือ
#define identifier replacement
#undef identifier
ชุดคำสั่ง #define ใช้เพื่อแทนที่ตัวอักษรใดๆ ที่พบที่เหมือนกับ identifier ให้เป็น replacement ตัวอย่างเช่น
#define TABLE_SIZE 10
int number[TABLE_SIZE];
ในตัวอย่าง เราได้สร้างคำสั่ง (directive) ที่มีชื่อว่า TABLE_SIZE และให้ตัวแทนที่คือ "10" เมื่อก่อนที่โปรแกรมคอมไพล์ processor จะหาคำว่า TABLE_SIZE และแทนที่มันด้วย 10 ดังนั้นข้างบนจะได้ผลลัพธ์เหมือนกันกับต่อไปนี้
int number[10];
เราสามารถยกเลิก (undefine) directives ใดๆ ที่เราสร้างไปโดยการใช้คำสั่ง #undef ของ macro ตัวอย่างเช่น
#undef TABLE_SIZE
ในการเขียนโปรแกรมในภาษา C นั้นเรามักจะใช้คำสั่งเหล่านี้สำหรับกำหนดค่าคงที่ให้กับตัวเลขที่ทำงานโดย processor เพื่อให้โปรแกรมทำงานได้เร็วขึ้น มาดูตัวอย่างโปรแกรมการใช้งานของคำสั่ง #define และ #undef ในภาษา C
#include <stdio.h>
#define SIZE 5
char name[SIZE][20];
int score[SIZE];
int main() {
int i;
for (i = 0; i < SIZE; i++) {
printf("Name %d: ", i + 1);
scanf("%s", name[i]);
printf("Score %d: ", i + 1);
scanf("%d", &score[i]);
}
for (i = 0; i < SIZE; i++) {
printf("%s has score %d\n", name[i], score[i]);
}
return 0;
}
ในตัวอย่าง เป็นโปรแกรมในการเก็บชื่อและคะแนนไว้ในอาเรย์ โดยเราได้กำหนดขนาดของอาเรย์ด้วย SIZE
ซึ่งเกิดขึ้นก่อนที่โปรแกรมจะทำงาน นั่นหมายความว่าเมื่อโปรแกรมคอมไพล์เสร็จสิ้นแล้ว มันจะแทนที่สำหรับ SIZE
เป็น 5 ที่เราได้กำหนดไว้ ดังนั้นโปรแกรมของเราจึงเก็บรายชื่อและคะแนนของ 5 คน และแสดงผลออกทางหน้าจอ
Name 1: Mateo
Score 1: 83
Name 2: Thomas
Score 2: 73
Name 3: Danny
Score 3: 54
Name 4: Marco
Score 4: 85
Name 5: Jose
Score 5: 43
Mateo has score 83
Thomas has score 73
Danny has score 54
Marco has score 85
Jose has score 43
นี่เป็นผลลัพธ์การทำงานของโปรแกรมในการใช้งานคำสั่ง #define ในภาษา C
Conditional inclusions (#ifdef, #ifndef, #if, #endif, #else and #elif)
Conditional inclusions เป็นชุดคำสั่งที่ใช้ในการตรวจสอบ macro directives ว่าได้เคยสร้างขึ้นก่อนหน้าหรือไม่ โดยไม่สำคัญว่าจะมีค่าเป็นอะไร
คำสั่ง #ifdef ใช้ตรวจสอบ marco identifier ที่ต้องการ ถ้ามันถูกสร้างไว้ก่อนหน้า processor จะทำการประมวลผลในบล็อคคำสั่งของ #ifdef โดยจะสิ้นสุดด้วยคำสั่ง #endif
#define TABLE_SIZE 100
#ifdef TABLE_SIZE
int number[TABLE_SIZE];
#endif;
คำสั่ง #ifndef เป็นคำสั่งที่ตรงกันข้ามกับคำสั่ง #ifdef โดยคำสั่งนี้จะตรวจสอบว่าถ้า macro directive นี้ไม่ได้สร้างก่อนหน้าจะเป็นจริง
#ifndef TABLE_SIZE
#define TABLE_SIZE 100
#endif;
สำหรับคำสั่ง #if, #endif, #else และ #elif ใช้ที่กับ marco directive ในการเปรียบเทียบเงื่อนไขกับค่าคงที่ คำสั่งเหล่านี้ทำงานเหมือนกับคำสั่ง if , else และ else ที่คุณได้เรียนไปก่อนหน้า
#if TABLE_SIZE>100
#undef TABLE_SIZE
#define TABLE_SIZE 200
#elif TABLE_SIZE<50
#undef TABLE_SIZE
#define TABLE_SIZE 50
#else
#undef TABLE_SIZE
#define TABLE_SIZE 100
#endif
int number[TABLE_SIZE];
เพื่อใช้คุณเข้าใจถึงวิธีการใช้งานของคำสั่งเหล่านี้มากขึ้น ต่อไปมาดูตัวอย่างการใช้งานของคำสั่ง #ifdef เพื่อตรวจสอบว่า marco ได้ถูกกำหนดหรือไม่
#include <stdio.h>
#define DEBUG 1
int main() {
int a;
int b;
#ifdef DEBUG
printf("Debug mode\n");
#endif
printf("Enter two number: ");
scanf("%d%d", &a, &b);
#ifdef DEBUG
printf("a = %d, b = %d\n", a, b);
#endif
printf("a + b = %d\n", a + b);
return 0;
}
ในตัวอย่าง เป็นโปรแกรมรับค่าตัวเลขสองตัวและหาผลรวมซึ่งในโปรแกรมของเราสามารถที่จะเปิดโหมด Debug เพื่อดูค่าของตัวแปร a และ b ได้ โดยการประกาศ marco ที่ชื่อว่า DEBUG
ในโปรแกรมถ้าหาก marco DEBUG
ถูกประกาศนั่นหมายความว่าโปรแกรมอยู่ในโหมด debug และถ้าไม่ประกาศโปรแกรมไม่อยู่
Debug mode
Enter two number: 12 34
a = 12, b = 34
a + b = 46
นี่เป็นผลลัพธ์การทำงานของโปรแกรม
Enter two number: 12 34
a + b = 46
และนี่เป็นผลลัพธ์การทำงานของโปรแกรมเมื่อเราได้รันโปรแกรมอีกครั้ง และลบในบรรทัดที่ประกาศประกาศ DEBUG
ออกไป ทำให้คำสั่งการแสดงผลบางส่วนไม่ถูกคอมไพล์โดยคอมไพล์เลอร์
Source file inclusion (#include)
คำสั่ง #include ใช้เพื่อ include ไลบรารี่มาตรฐานของภาษา C หรือไลบรารี่ที่เราสร้างขึ้นมาเองได้ เพื่อที่จะนำมาใช้ในการเขียนโปรแกรม เช่น การรับค่าและการแสดงผลทางคีย์บอร์ด เราจะใช้ไลบรารี่ stdio.h หรือ time.h สำหรับการใช้ฟังก์ชันเกี่ยวกับเวลา ตัวอย่างเช่น
#include <stdio.h>
#include <time.h>
#include "myLibrary.h"
ในตัวอย่าง สองบรรทัดแรกเป็นการ include ไลบรารี่มาตราฐานของภาษา C และอันที่สามเป็นการ include ไลบรารี่ที่คุณสร้างขึ้นมาเอง
ในบทนี้ คุณได้เรียนรู้เกี่ยวกับการใช้งาน processor directive ในเบื้องต้นของภาษา C