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