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 ในการทดสอบ