Storage Class คือ สิ่งที่ใช้กําหนดขอบเขตของตัวแปรว่าจะให้ใครสามารถเข้ามาเรียกใช้งานได้บ้าง และยังสามารถกําหนดระยะเวลาว่าจะให้โปรแกรมเก็บค่าของตัวแปรนั้นไว้นานเท่าไรได้ด้วย Storage Class แบ่งออกเป็น 4 ประเภท คือ
- auto
- extern
- static
- register
auto
เป็นการประกาศ automatic variable หรือก็คือ ตัวแปรแบบโลคอลนั่นเอง ตัวแปรประเภทนี้เป็นตัวแปรทั่วไปที่ประกาศขึ้นใช้งาน เช่น
int number;
char str;
โดยปกติเมื่อประกาศตัวแปรขึ้นมาดังตัวอย่าง ตัวแปรนั้นจะเป็นตัวแปรแบบ automatic variable อยู่แล้ว ไม่ต้องระบุอะไรเพิ่มเติม ซึ่งจะมีเฉพาะ function ที่สร้างตัวแปรนั้นขึ้นมาเท่านั้นที่จะสามารถใช้งานตัวแปรนั้นได้ และตัวแปรนั้นจะถูกทําลายเมื่อ function นั้นทํางานเสร็จ จึงเป็นเหตุให้ function อื่นๆไม่สามารถเรียกใช้ตัวแปลดังกล่าวได้
extern
extern variable เป็นตัวแปรแบบโกลบอลที่ทุก function สามารถมองเห็น และเรียกใช้งานได้ แต่จะถูกประกาศไว้ที่ไฟล์อื่นๆ โดยระบุ extern ไว้หน้าตัวแปรเพื่อทําการอ้างอิงไปยังตัวแปรนั้นๆในไฟล์อื่น ตัวอย่าง ไฟล์ print.c
#include <stdio.h>
extern int num;
void print(){
printf("Number is %d\n", num);
}
ไฟล์ testPrint.c
#include <stdio.h>
#include "print.c"
int num = 9;
main(){
print();
}
จะเห็นว่าในไฟล์ print.c ประกาศตัวแปร num เป็นแบบ extern และในไฟล์ testPrint.c มีการกําหนดค่าให้กับตัวแปร num เมื่อเรียก function print(); โปรแกรมจะ print เลข 9 ออกมา
static
ตัวแปรแบบ static variable เป็นตัวแปรที่ประกาศแบบโลคอล หรือโกลบอล ก็ได้ static variable จะถูกสร้าง เมื่อโปรแกรมเริ่มทํางาน และจะถูกทําลายเมื่อโปรแกรมจบการทํางาน(จบการทํางานของโปรแกรม ไม่ใช้จบการทํางานของ function) ดังนั้นเมื่อโปรแกรมกลับมาทํางาน function เดิมอีกครั้งค่าของตัวแปรก็ยังคงอยุ่(หมายถึงเป็นค่าล่าสุด กลังจากเรียก function นั้นครั้งสุดท้าย) ตัวอย่าง ไฟล์ printVar.c
#include <stdio.h>
extern int num;
void printVar(){
auto int a = 0;
static int b = 0;
a++;
b++;
print("a = %d b = %d\n", a, b);
}
ไฟล์ testVar.c
#include <stdio.h>
#include "printVar.c"
main(){
int i;
for(i=0;i<5;i++){
printVar();
}
}
ผลลัพธ์ของโปรแกรม
a = 1 b = 1
a = 1 b = 2
a = 1 b = 3
a = 1 b = 4
a = 1 b = 5
จะเห็นว่า ตัวแปร a ที่เป็น แบบ automatic variable จะได้ค่าเริ่มต้นทุกครั้งที่เรียก function แต่ ตัวแปร b ซึ่งเป็นตัวแปบแบบ static variable จะถูกเพิ่มค่าขึ้นไปเรื่อยๆในทุกๆครั้งที่เรียก function
register
ปกติแล้วเมื่อเราประกาศตัวแปรขึ้นใช้งานระบบจะเก็บข้อมูลไว้ใน ram แต่ตัวแปรแบบ register variable เป็นตัวแปรที่จะเก็บข้อมูลใน register บน CPU ข้อดีมันจะทํางานเร็วมากกว่าเก็บบน ram
ถ้าประกาศตัวแปรประเภทนี้มากเกินไปอาจจะทําให้ register เต็มได้เนื่องจาก register มันมีน้อย ดังนั้นการใช้งานก็ควรใช้เท่าที่จําเป็นเท่านั้น