Preprocessor directives

27 June 2015

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

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