Preprocessor ในภาษา C มีอะไรบ้าง จัดทำโดย : langjuko พิมพ์

Preprocessor ในภาษา C มีอะไรบ้าง

เรื่องของ #include

#include <ชื่อไฟล์ส่วนหัว>
#include “ชื่อไฟล์ส่วนหัว”

การใช้ #include มีสองลักษณะ คือ ใช้เครื่องหมาย <….> เพื่อบอกว่าตำแหน่งของไฟล์ .h นั้นอยู่ในโฟลเดอร์ lib แต่ถ้าใช้ “…” นั้นหมายความว่าไฟล์ส่วนหัวอยู่ในโฟลเดอร์ปัจจุบันของไฟล์โปรแกรม

Example

Mylibrary.h

int GetSum( int x, int y)
{
 return x+y;
}

MainProgram.h

#include <stdio.h>
#include <conio.h>
#include “mylibrary.h”

void main( )
{
 printf(“Sum = %d\n”,GetSum(5,6);
}

#define

#define ชื่อของค่าคงที่ [ค่าที่ต้องการ]

ใช้ในการประกาศค่าคงที่ในโปรแกรม เมื่อประกาศแล้วจะเปลี่ยนแปลงไม่ได้ตลอดโปรแกรม

Example 1

#include <stdio.h>
#define MAX 10

void main()
{
 for (int i=0;i<MAX;i++)
 {
  printf("Hello\n");
 }
}

Example 2

การใช้ define สามารถประมวลผลเล็กๆ น้อยๆ ได้ เช่น

#define DOUBLE(x) x+x
#define SUM(a1,a2) a1+a2
…………..
…………
printf("Double = %d\n",DOUBLE(25));
printf("Sum = %d\n",SUM(25,5));

Example 3

เราสามารถเพิ่มเงื่อนไขในการประกาศค่าคงที่ได้ ดังตัวอย่าง

#define FINDMAX(a,b) (a>b ? a : b)
……………..
printf("Max = %d\n",FINDMAX(1,5));

จากตัวอย่าง เรากำหนดให้รับค่ามา 2 ค่า และตรวจสอบว่า a>b หรือไม่ ถ้าใช่ก็จะให้ค่าที่อยู่หลังจากเครื่องหมาย ? แต่ถ้าไม่ใช่ ก็จะให้ค่า b ออกมา การใช้เครื่องหมาย ? และ : ก็จะเหมือนกับ if และ else นั่นเอง ลองดูอีกตัวอย่างหนึ่ง

#define ISEMPTY(x) (x==0 ? 1 : 0)
…………
int data;
data=0;
if (ISEMPTY(data))
{
 printf("It is empty\n");
}

ผลการรัน
It is empty

หรือจะเขียนแบบนี้ก็ได้ ไม่ว่ากัน

#define ISEMPTY(x) (x==0 ? "YES" : "NO")
………………..
int data=0;
printf("%s\n",ISEMPTY(0));

#undef

#under ชื่อค่าคงที่ที่ต้องการลบ

ใช้ยกเลิกค่าคงที่ ซึ่งถ้าเรายกเลิกแล้ว โปรแกรมอาจจะแปลไม่ผ่าน เพราะหาค่าคงที่นั้นไม่เจอ.. เราจะใช้ในกรณีที่ต้องการเปิดช่องทางให้ผู้พัฒนาโปรแกรมต่อจากเราสามารถปรับแต่งโค้ดของเราได้ยืดหยุ่นมากยิ่งขึ้น

Example

#include <stdio.h>

#define PINE 3.14

void main()
{
 printf("PINE = %f\n",PINE);
#undef PINE
 printf("PINE = %f\n",PINE); 
}

ตัวอย่างนี้ แปลโปรแกรมไม่ได้ ค่าคงที่ PINE ถูกประกาศแล้ว แต่ใน main ไปเขียนยกเลิกค่าคงที่ มันเลยเกิด Error ที่บรรทัดสุดท้ายนั่นเอง

#ifdef, #ifndef, #else, #elif, #endif

#ifdef  x ค่า x ต้องการมีการประกาศเอาไว้หรือไม่
#ifndef x ค่า x ไม่มีการประกาศเอาไว้ใช่หรือไม่
#elif x  ใช้ร่วมกับสองตัวด้านบนในกรณีที่ต้องการตรวจสอบค่าอื่น
#else   ใช้ร่วมกับ #ifdef, #ifndef และ #elif
#endif
  เขียนเอาไว้ตอบจบทุกครั้งที่เรียกใช้ไดเร็กทีฟชุดนี้

ใช้เหมือนกับ if, else, elseif ซึ่งเป็นการตรวจสอบว่าค่าที่ต้องการนั้นมีการประกาศเอาไว้หรือไม่ ลองดูตัวอย่างเพื่อความเข้าใจ

Example 1

#include <stdio.h>

#define PINE 3.14

void main()
{
#ifdef PINE
 printf("Circle area = %f\n",PINE*2.5*2.5);
#else
 printf("Constant PINE doesn't exist\n");
#endif
}

RUN
Circle area = 19.625000

Example 2

#include <stdio.h>

void main()
{
#ifdef PINE
 printf("Circle area = %f\n",PINE*2.5*2.5);
#else
 printf("Constant PINE doesn't exist\n");
#endif
}

RUN
Constant PINE doesn't exist

จากทั้งสองตัวอย่าง ตัวอย่างแรกจะมีการประกาศ PINE เอาไว้ เมื่อมาใน #ifdef ก็จะเช็คว่าค่าคงที่ PINE มีการประกาศเอาไว้หรือไม่ ถ้าใช่ก็ให้เอามาคำนวณหาพื้นที่วงกลม แต่ในตัวอย่างที่ 2 ได้ตัดการประกาศค่า PINE ออกไป ผลการรันโปรแกรมจึงตกลงมาทำที่ #else

 

คุณอาจสนใจ
แอลซีดี ทีวี รุ่นใหม่ดีกว่าอย่างไร ?
สายลม (16,082 - 26 เม.ย. 51)
การปรับเปลี่ยนขนาดฟอนต์ Font
อ้อม (19,420 - 13 ม.ค. 50)
การทำ Flash Popup menu V.2
Black-Hawk (101,008 - 23 ม.ค. 51)
ทำฟอนต์ให้เป็นลาย
langjuko (164,427 - 24 ก.ย. 51)
ห้ามให้ใครมาเปลี่ยนการตั้งค่า Appearance ด้วยการซ่อนหน้า Appearance
เว็บไทยดีดี (15,813 - 19 ม.ค. 51)
เลือกการ์ดจอสำหรับเล่นเกมส์
สายลม (17,572 - 12 เม.ย. 51)
การทำ Expaning_text
Black-Hawk (123,872 - 22 ก.พ. 51)
การใช้งานคำสั่ง strftime
Mr.GuruZ (25,686 - 03 มิ.ย. 49)