#define และ #include ใน ภาษา C
ภาพรวม
ข้อความสั่งทั้งหมดที่ขึ้นต้นด้วย สัญลักษณ์ # (แฮช) เรียกว่าคำสั่ง/คำสั่ง ตัวประมวลผลล่วงหน้า ดังนั้น #define และ #include จึงเรียกว่าคำสั่งตัวประมวลผลล่วงหน้า คำสั่งของตัวประมวลผลล่วงหน้าจะถูกดำเนินการก่อนคำสั่งอื่นๆ ในโปรแกรมของเรา ในโปรแกรม C โดยทั่วไป เราจะเขียนคำสั่งตัวประมวลผลล่วงหน้าทั้งหมดที่อยู่นอก ฟังก์ชัน main() ที่ด้านบนสุดของโปรแกรม C ของเรา #define directive ใช้เพื่อกำหนด ค่าคงที่หรือนิพจน์ในโปรแกรม C ของเรา ในขณะที่ #include directive ใช้เพื่อรวมเนื้อหาของไฟล์ส่วนหัวในโปรแกรม C ของเรา
ขอบเขต
- บทความนี้เป็นข้อมูลเบื้องต้นเกี่ยวกับคำสั่งพรีโปรเซสเซอร์เช่น #define และ #include
- บทความนี้ประกอบด้วยคำจำกัดความ ไวยากรณ์ และตัวอย่างของ #define และ #include directives
บทนำ
คำสั่งพรีโปรเซสเซอร์มีสามประเภทหลักที่ใช้ในโปรแกรม C: แมโคร การ รวมไฟล์ การคอมไพล์ตามเงื่อนไข
มาโคร
เป็นค่าคงที่หรือนิพจน์ที่สามารถกำหนดได้โดยใช้คำสั่ง #define ในโปรแกรม C ของเรา ตัวอย่าง :
- การกำหนดค่า
#define G 9.8
- การกำหนดนิพจน์
#define SUM(a,b) (a + b)
เป็นการเพิ่มการกำหนดเป็นเนื้อหาของไฟล์ส่วนหัวในโปรแกรม C ของเรา และสามารถทำได้โดยใช้คำสั่ง #include ตัวอย่าง :
- รวมไฟล์ส่วนหัวของเอาต์พุตอินพุตมาตรฐาน
#include <stdio.h>
- รวมถึงไฟล์ส่วนหัวของฟังก์ชันไลบรารีมาตรฐาน
#include <stdlib.h>
การรวบรวมตามเงื่อนไข
กำลังเรียกใช้หรือข้ามโค้ดบางส่วนที่เงื่อนไขมาโครบางอย่าง (ค่าคงที่หรือนิพจน์ที่กำหนดโดยใช้ #define) และสามารถทำได้โดยใช้คำสั่งเช่น #ifdef, #endif, #ifndef, #if, #else and #elif ในโปรแกรม C ตัวอย่าง :
- printing age if macro is defined, else printing not defined
#include <stdio.h>
// if we uncomment the below line, then the program will print AGE in the output.
// #define AGE 18
int main() {
#ifdef AGE
printf("Age is %d", AGE);
#else
printf("Not Defined");
#endif
return 0;
}

ตอนนี้ เพื่อให้เข้าใจวิธีการและสาเหตุที่ใช้คำสั่งของตัวประมวลผลล่วงหน้าก่อนการคอมไพล์ ให้เราดูที่กระบวนการของกระบวนการรวบรวมทั้งหมดทำงานอย่างไรในโปรแกรม C
สมมติว่าเราได้เขียน โปรแกรม hello.c เพื่อพิมพ์ Hello, World! ในการส่งออก กระบวนการคอมไพล์จะสร้างไฟล์เรียกทำงาน Hello.exe จาก ไฟล์ โปรแกรม hello.c ของเรา

กระบวนการรวบรวม (Compilation Process)
เป็นกระบวนการแปลงรหัสที่มนุษย์เข้าใจได้ (ระดับสูง) ให้เป็นรหัสที่เข้าใจได้ด้วยเครื่อง (ระดับต่ำ) ให้เราดูขั้นตอนที่เกี่ยวข้องกับกระบวนการรวบรวม
- ขั้นตอนที่ 1 เรามีไฟล์โปรแกรม C ที่เขียนด้วยนามสกุล .c เช่นไฟล์ hello.c
- ขั้นตอนที่ 2 คือการประมวลผลล่วงหน้าของไฟล์ส่วนหัวคำสั่งทั้งหมดที่ขึ้นต้นด้วย# (สัญลักษณ์แฮช) จะถูกแทนที่ระหว่างกระบวนการคอมไพล์ด้วยความช่วยเหลือของตัวประมวลผลล่วงหน้า มันสร้างไฟล์ระดับกลางที่มี นามสกุลไฟล์ .i เช่นไฟล์ hello.i
- ขั้นตอนที่ 3 คือการรวบรวม ไฟล์ hello.i ซอฟต์แวร์คอมไพเลอร์แปลไฟล์ hello.i เป็นไฟล์ hello.s โดยมีคำแนะนำระดับการประกอบ (รหัสระดับต่ำ)
- ขั้นตอนที่ 4 คำแนะนำเกี่ยวกับรหัสระดับแอสเซมบลีจะถูกแปลงเป็นรหัสที่เครื่องเข้าใจได้ (รูปแบบไบนารี/เลขฐานสิบหก) โดยแอสเซมเบลอร์ และไฟล์ที่สร้างขึ้นเรียกว่าอ็อบเจ็กต์ไฟล์ที่มีนามสกุล .obj เช่นไฟล์ hello.obj
- ขั้นตอนที่ 5 Linkerใช้เพื่อเชื่อมโยงไฟล์ไลบรารีกับไฟล์อ็อบเจ็กต์เพื่อกำหนดคำสั่งที่ไม่รู้จัก มันสร้างไฟล์ปฏิบัติการที่มี นามสกุล .exe เช่นไฟล์ hello.exe
- ต่อไป เราสามารถเรียกใช้ ไฟล์เรียกทำงาน hello.exe เพื่อรับผลลัพธ์ที่ต้องการในหน้าต่างเอาต์พุตของเรา
แผนภาพด้านล่างแสดงขั้นตอนทั้งหมดที่เกี่ยวข้องกับกระบวนการรวบรวม

ตอนนี้ ให้เราดูคำจำกัดความ ไวยากรณ์ และตัวอย่างของ #define และ #include
#define ใน C คืออะไร?
- #define เป็นคำสั่งตัวประมวลผลล่วงหน้าที่ใช้ในการกำหนดมาโครในโปรแกรม C
- #define ยังเป็นที่รู้จักกันในนามคำสั่งแมโคร
- #define directive ใช้เพื่อประกาศค่าคงที่บางค่าหรือนิพจน์ที่มีชื่อที่สามารถใช้ได้ตลอดทั้งโปรแกรม C ของเรา
- เมื่อใดก็ตามที่พบคำสั่ง #define ชื่อแมโครที่กำหนดจะแทนที่ด้วยค่าคงที่ที่กำหนดไว้หรือนิพจน์
#include ใน C คืออะไร?
- #include เป็นคำสั่งพรีโปรเซสเซอร์ที่ใช้สำหรับการรวมไฟล์ในโปรแกรม C
- #include ยังเป็นที่รู้จักกันในนามคำสั่งการรวมไฟล์
- #include directive ใช้เพื่อเพิ่มเนื้อหา/ชิ้นส่วนของโค้ดจากไฟล์ส่วนหัวที่สงวนไว้ลงในไฟล์โค้ดของเราก่อนที่จะคอมไพล์โปรแกรม C ของเรา
- ไฟล์ส่วนหัวเหล่านี้มีคำจำกัดความของฟังก์ชันที่กำหนดไว้ล่วงหน้ามากมาย เช่น printf() , scanf() , getch() เป็นต้น
ไวยากรณ์ของ #define ใน C
#define C_NAME value
หรือ
#define C_NAME expression
CNAME : ชื่อของค่าคงที่หรือนิพจน์ โดยทั่วไป โปรแกรมเมอร์กำหนดด้วยอักษรตัวพิมพ์ใหญ่ แต่ไม่จำเป็น เช่นLIMIT , AREA(l,b) เป็นต้น
value : สามารถเป็นค่าคงที่ใดก็ได้และสามารถเป็นข้อมูลประเภทใดก็ได้ int , char , float , string เป็นต้น
expression : อาจเป็นโค้ดส่วนใดก็ได้หรือนิพจน์ทางคณิตศาสตร์ เช่น (length * breadth), (a * a), เป็นต้น
ตัวอย่างไวยากรณ์ :
#define PI 3.14
#define AREA(l,b) (l * b)
หมายเหตุ : #define directive ไม่ต้องการ ; (เซมิโคลอน) ที่ส่วนท้ายของคำสั่ง
ไวยากรณ์ของ #include ใน C
#include <filename>
หรือ
#include "filename"
filename : เป็นชื่อไฟล์ส่วนหัวที่จำเป็นในโปรแกรม C ของเรา
ตัวอย่างไวยากรณ์ :
#include <stdio.h>
#include "conio.h"
ตัวอย่างของ #define ใน C
เราจะเห็นตัวอย่าง#define สองตัวอย่าง อันดับแรกด้วยค่าคงที่ และวินาทีด้วยนิพจน์
พื้นที่ของวงกลมโดยใช้ค่า #define CNAME
เรากำลังกำหนดค่า PI ให้เป็น 3.14 ในตัวอย่างด้านล่างโดยใช้ คำสั่ง #define เรากำลังใช้ ค่า PI ในการคำนวณพื้นที่ของวงกลมเช่น PI * r * r
โปรแกรมซี :
#include <stdio.h>
// defines the PI value to be 3.14 in the whole program
#define PI 3.14
int main() {
float radius, area;
printf("Enter radius of circle to find its area : ");
scanf("%f", &radius);
// PI will be replaced by 3.14 in the below statement
area = PI * radius * radius;
printf("Area of Circle : %0.2f", area);
return 0;
}

คำอธิบาย :
- เราได้รวมไฟล์ส่วนหัวของเอาต์พุตอินพุตมาตรฐานโดยใช้คำสั่ง#include <stdio.h>
- เราได้กำหนดค่าของ PI เป็น 3.14 โดยใช้คำสั่ง #define
- ใน ฟังก์ชัน main() เราใช้อินพุตตัวแปรรัศมี float radius และ ตัวแปร area เพื่อเก็บค่าพื้นที่
- area = PI * radius * radius, ในคำสั่งนี้ PI จะถูกแทนที่ด้วย 3.14 ตามที่เราได้กำหนดไว้โดยใช้คำสั่ง #define
- printf(“\nArea of Circle : %0.2f”, area); จะพิมพ์พื้นที่ของวงกลมด้วยความแม่นยำของทศนิยม 2 ตำแหน่ง
- return 0; จะออกจากโปรแกรมสำเร็จ
Square of a given number using #define CNAME expression.
เรากำลังกำหนดนิพจน์ทางคณิตศาสตร์ (a * a) ให้กับ cname SQR(a) เพื่อคำนวณกำลังสองของตัวเลขโดยใช้คำสั่ง #define
โปรแกรมซี :
#include<stdio.h>
// defines a function SQR(a) returning (a * a) and with 'a' being a parameter
#define SQR(a) (a * a)
int main() {
int num;
printf("Enter a number to find its square : ");
scanf("%d", &num);
// SQR(num) replaces square of num in the output
printf("Square of %d : %d", num, SQR(num));
return 0;
}

คำอธิบาย :
- เราได้รวมไฟล์ส่วนหัวของเอาต์พุตอินพุตมาตรฐานโดยใช้คำสั่ง#include <stdio.h>
- เราได้กำหนดนิพจน์ SQR(a)ให้เป็น (a * a)โดยใช้คำสั่ง#define
- ใน ฟังก์ชัน main() เรา ใช้ตัวแปรจำนวนเต็มอินพุตnum
- printf(“\nSquare of %d : %d”, num, SQR(num)); ในคำสั่งนี้ SQR(num) จะถูกแทนที่ด้วย (num * num) และพิมพ์กำลังสองของnumในผลลัพธ์
- return 0; จะออกจากโปรแกรมสำเร็จ
ตัวอย่าง #include ใน C
ในตัวอย่างนี้ เราคำนวณผลรวมของตัวเลขอินพุตสองตัวโดยใช้ฟังก์ชัน scanf() และ printf() ฟังก์ชัน / คำจำกัดความของฟังก์ชันเหล่านี้จะรวมอยู่ในโปรแกรมโดยใช้คำสั่ง #include <stdio.h>
โปรแกรมซี :
#include <stdio.h>
int main() {
int num1, num2, sum;
// we can use printf() and scanf() function because
// these functions are pre-defined in the stdio.h header file
printf("Enter two numbers to find their sum : ");
scanf("%d %d", &num1, &num2);
sum = num1 + num2;
printf("Sum of %d and %d is : %d", num1, num2, sum);
return 0;
}
อินพุตที่กำหนดเองเช่น 16 14 และ เอาท์พุต :

คำอธิบาย :
- เราได้รวมไฟล์ส่วนหัวของเอาต์พุตอินพุตมาตรฐานโดยใช้คำสั่ง #include <stdio.h>
- ตอนนี้ เราสามารถใช้ฟังก์ชันเอาต์พุตอินพุตมาตรฐาน เช่น printf() สำหรับเอาต์พุต และ scanf() สำหรับอินพุต
- ใน ฟังก์ชัน main()เราใช้ตัวแปรจำนวนเต็มอินพุตสามตัว num1 , num2 และ sum
- printf(“Enter two numbers to find their sum : “); พิมพ์ตัวเลข Enter two เพื่อค้นหาผลรวม :ในผลลัพธ์
- scanf(“%d %d”, &num1, &num2);, คำสั่งนี้ใช้รับจำนวนเต็มอินพุตสองตัวจากผู้ใช้เช่นnum1และnum2
- printf(“\nSum of %d and %d is : %d”, num1, num2, sum); จะพิมพ์ผลรวมของตัวเลขจำนวนเต็มอินพุตสองตัว num1 และ num2
- ฟังก์ชัน printf() และ scanf() ถูกกำหนดไว้ล่วงหน้าใน ไฟล์ส่วนหัว stdio.h และนั่นคือเหตุผลที่เราสามารถใช้งานได้ในโปรแกรมของเรา
- return 0; จะออกจากโปรแกรมสำเร็จ
บทสรุป
- #define และ #include เป็นคำสั่งตัวประมวลผลล่วงหน้าที่เขียนนอกฟังก์ชัน main()
- คำสั่งตัวประมวลผลล่วงหน้าจะถูกดำเนินการก่อนการคอมไพล์โปรแกรมของเรา
- #define ใช้เพื่อประกาศค่าคงที่หรือนิพจน์ด้วย CNAME ที่สามารถใช้ได้ตลอดทั้งโปรแกรม
- #include ใช้เพื่อรวมเนื้อหาของไฟล์ส่วนหัวในโปรแกรม C ของเรา
credit : https://www.scaler.com/topics/c/