วันพฤหัสบดีที่ 23 ธันวาคม พ.ศ. 2553

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



เรื่องของ #include



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


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


Example


Mylibrary.h


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


MainProgram.h


#include
#include
#include “mylibrary.h”


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


#define


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


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


Example 1


#include
#define MAX 10


void main()
{
for (int i=0;i

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


#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


#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


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


บทความจากเว็บไซต์ webthaidd.com

ไม่มีความคิดเห็น:

แสดงความคิดเห็น