#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/

Leave a Reply

Your email address will not be published. Required fields are marked *