Storage Classes ขอบเขตของตัวแปร ภาษา C คือ สิ่งที่ใช้กําหนดขอบเขตของตัวแปรว่าจะให้ใครสามารถเข้ามาเรียกใช้งานได้บ้าง และยังสามารถกําหนดระยะเวลาว่าจะให้โปรแกรมเก็บค่าของตัวแปรนั้นไว้นานเท่าไรได้ด้วย  Storage Classes แบ่งออกเป็น 4 ประเภท คือ

  • auto
  • register
  • static
  • extern


auto


auto storage class คือการจัดเก็บเป็นชั้น โดยจัดเก็บข้อมูลเริ่มต้นสำหรับตัวแปร Local ทั้งหมด เป็นการประกาศ automatic variable หรือก็คือ ตัวแปรแบบโลคอลนั่นเอง ตัวแปรประเภทนี้เป็นตัวแปรทั่วไปที่ประกาศขึ้นใช้งาน เช่น

{
   int mount;
   auto int month;
}


ตัวอย่างข้างต้นกำหนดตัวแปรสองตัวในคลาสการจัดเก็บเดียวกัน ‘auto’ สามารถใช้ได้เฉพาะในฟังก์ชัน เช่น ตัวแปรแบบโลคอล

register


register storage class คือการจัดเก็บข้อมูลที่จะใช้ในการกำหนดตัวแปรโลคอลที่ควรจะเก็บไว้ในการลงทะเบียนแทนแรม ซึ่งหมายความว่าตัวแปรมีขนาดสูงสุดเท่ากับขนาดรีจิสเตอร์ (โดยปกติคือหนึ่งคำ) และไม่สามารถใช้ตัวดำเนินการ ‘&’ ร่วมกันได้ (เนื่องจากไม่มีตำแหน่งหน่วยความจำ)

ปกติแล้วเมื่อเราประกาศตัวแปรขึ้นใช้งานระบบจะเก็บข้อมูลไว้ใน ram แต่ตัวแปรแบบ register variable เป็นตัวแปรที่จะเก็บข้อมูลใน register บน CPU ข้อดีมันจะทํางานเร็วมากกว่าเก็บบน ram

ถ้าประกาศตัวแปรประเภทนี้มากเกินไปอาจจะทําให้ register เต็มได้เนื่องจาก register มันมีน้อย ดังนั้นการใช้งานก็ควรใช้เท่าที่จําเป็นเท่านั้น

{
   register int  miles;
}


register ควรใช้เฉพาะกับตัวแปรที่ต้องการการเข้าถึงอย่างรวดเร็ว เช่น counters ควรสังเกตด้วยว่าการกำหนด ”register’ ไม่ได้หมายความว่าตัวแปรจะถูกเก็บไว้ในการลง register หมายความว่าอาจถูกเก็บไว้ในรีจิสเตอร์ขึ้นอยู่กับข้อจำกัดของฮาร์ดแวร์และการใช้งาน

static

static storage class คือการจัดเก็บโดยคอมไพเลอร์เพื่อให้ตัวแปรโลคอล ในการดำรงอยู่ในช่ตัวแปรแบบ static variable เป็นตัวแปรที่ประกาศแบบโลคอล หรือโกลบอล ก็ได้ static variable จะถูกสร้าง เมื่อโปรแกรมเริ่มทํางาน และจะถูกทําลายเมื่อโปรแกรมจบการทํางาน(จบการทํางานของโปรแกรม ไม่ใช้จบการทํางานของ function) ดังนั้นเมื่อโปรแกรมกลับมาทํางาน function เดิมอีกครั้งค่าของตัวแปรก็ยังคงอยุ่(หมายถึงเป็นค่าล่าสุด กลังจากเรียก function นั้นครั้งสุดท้าย)

static modifier ที่อาจนำไปใช้กับตัวแปรส่วนกลางได้ เมื่อดำเนินการเสร็จสิ้น จะทำให้ขอบเขตของตัวแปรนั้นถูกจำกัดไว้เฉพาะไฟล์ที่ประกาศ

ในการเขียนโปรแกรม C เมื่อใช้ static กับตัวแปรโกลบอล จะทำให้อ็อบเจ็กต์ทั้งหมดในคลาสเดียวกันใช้สำเนาของสมาชิกเพียงชุดเดียว

#include <stdio.h>
 
/* function declaration */
void func(void);
 
static int count = 5; /* global variable */
 
main() {

   while(count--) {
      func();
   }
	
   return 0;
}

/* function definition */
void func( void ) {

   static int i = 5; /* local static variable */
   i++;

   printf("i is %d and count is %d\n", i, count);
}


เมื่อโค้ดด้านบนถูกคอมไพล์และรัน มันจะให้ผลลัพธ์ดังต่อไปนี้ −


extern

extern storage class คือการจัดเก็บข้อมูลที่ใช้ในการให้การอ้างอิงของตัวแปร แบบโกลบอล ที่จะมองเห็นไฟล์ทั้งหมดในโปรแกรม เมื่อคุณใช้ ‘extern’ ตัวแปรจะไม่สามารถเริ่มต้นได้ แต่จะชี้ชื่อตัวแปรไปที่ตำแหน่งการจัดเก็บที่กำหนดไว้ก่อนหน้านี้

extern variable เป็นตัวแปรแบบโกลบอลที่ทุก function สามารถมองเห็น และเรียกใช้งานได้ แต่จะถูกประกาศไว้ที่ไฟล์อื่นๆ โดยระบุ extern ไว้หน้าตัวแปรเพื่อทําการอ้างอิงไปยังตัวแปรนั้นๆในไฟล์อื่น

เมื่อคุณมีหลายไฟล์และคุณกำหนดตัวแปรส่วนกลางหรือฟังก์ชัน ซึ่งจะใช้ในไฟล์อื่นด้วย จากนั้น extern จะถูกใช้ในไฟล์อื่นเพื่อให้การอ้างอิงของตัวแปรหรือฟังก์ชันที่กำหนดไว้ เพื่อความเข้าใจ extern ใช้เพื่อประกาศตัวแปรส่วนกลางหรือฟังก์ชันในไฟล์อื่น

extern modifier มักใช้เมื่อมีไฟล์ตั้งแต่ 2 ไฟล์ขึ้นไปที่แชร์ตัวแปรร่วมหรือฟังก์ชันเดียวกันตามที่อธิบายไว้ด้านล่าง

ไฟล์ 1 : main.c

#include <stdio.h>
 
int count ;
extern void write_extern();
 
main() {
   count = 5;
   write_extern();
}


ไฟล์ 2 : support.c

#include <stdio.h>
 
extern int count;
 
void write_extern(void) {
   printf("count is %d\n", count);
}


ในที่นี้ extern ถูกใช้เพื่อประกาศการนับในไฟล์ที่สอง โดยที่มีคำจำกัดความในไฟล์แรก main.c ตอนนี้ให้คอมไพล์ทั้งสองไฟล์ ได้ผลลัพธ์ ดังนี้ −

หมายเหตุ : การทดสอบด้านบน ใช้ Visual Studio 2022 ในการทดสอบ

Leave a Reply

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