C18 - Storage Class

วันที่โพสต์: Jan 11, 2011 2:45:4 PM

C18 - Storage Class

Storage  class  ของตัวแปร  เป็นสิ่งที่ใช้ในการบอกให้ Compiler รู้ว่าจะต้องจัดเก็บตัวแปรที่ตามหลังมาอย่างไร  ซึ่งมีผลถึง

ทำไมต้องมี  Storage  class  ???

     เนื่องจากภาษาซีเอื้ออำนวยให้สามารถเขียนโปรแกรมและคอมไพล์เป็นส่วนย่อย ๆ ก่อนที่จะนำมาลิงค์เป็นโปรแกรมใหญ่ ภาษาซียอมให้ตั้งชื่อตัวแปรซ้ำกันได้ในต่างฟังก์ชัน  ดังนั้นส่วน storage class  จะช่วยให้ compiler รู้ว่าควรจะจัดการกับตัวแปรต่าง ๆ อย่างไรจึงจะตรงกับความต้องการในการใช้งานของโปรแกรมเมอร์และหลีกเลี่ยงความผิดพลาดต่าง ๆ ที่อาจเกิดขึ้นได้

     ใน C18 complier ของ MPLAB รองรับ ANSI standard storage classes ตัวแปร เช่นกัน ได้แก่ auto , extern, register, static และ typedef  ซึ่งแต่ละคำ มาจากคำว่า 

รูปแบบการใช้ ตัวแปร Storage Class

ตัวบ่งบอกStorage_Class ชนิดตัวแปร ตัวแปร

ตัวแปรแบบ Automatic

    โดยปกติ ตัวแปรที่ประกาศภายใน function จะเป็นตัวแปร automatic ทุกตัว ไม่เว้นกระทั่งภายใน function main() เมื่อ function ทำงานสิ้นสุดลง ตัวแปรภายใน function ก็จะหมดหน้าที่ลง ถูกทำลายไปโดยอัตโนมัติ หรือที่เราเรียกว่า ตัวแปรแบบ local นั่นแหละ เราสามารถประกาศตัวแปร พวกนี้ โดยใส่คำว่า auto นำหน้าตัวแปร หรือไม่้ใส่ก็ได้ ซึ่งการประกาศตัวแปรพวกนี้ จะไม่ได้ถูกตั้งค่าเริ่มต้นให้ เราจะต้องตั้งค่าเริ่้มต้นเอาเอง และค่าเริ่มต้น ที่ไม่ได้กำหนด ก็ไม่ใช่ค่าศูนย์ เสีียด้วย เพราะฉะนั้น ตรงนี้ให้ระวังไว้  พิจรณา ตัวอย่าง 

ตัวแปร external หรือตัวแปร extern

เป็นลักษณะการแก้ปัญหา การประกาศตัวแปร ที่เป็น global ที่มีชื่อซ้ำกัน แต่อยู่กันคนละไฟล์ ในโปรเจคเดียวกัน ถ้าเราไม่ได้ใช้ keyword extern ในการแก้ปัญหานี้ เวลาที่คอมไำพล์จะไม่มีปัญหา แต่เวลาที่ linker จะต้องเอาแต่ละไฟล์ที่โปรเจคอ้างถึง จะเกิดปัญหาแจ้ง error message ออกมา 

ตัวแปร static 

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

ตัวแปร register 

    เราใช้การระบุ register หน้าตัวแปรทีเป็นตัวแปร local ที่เราต้องการให้เก็บค่าตัวแปรนั้นไว้ที่ register แทนที่เราจะเก็บไว้ที่ RAM นั่นหมายความว่า ขนาดของตัวแปรจะมีขนาดใหญ่เท่ากับขนาดของรีจิสเตอร์ (โดยทั่วไปก็ 1 word) และไม่สามารถใช้การอ้างอิงแบบแอดเดรสได้ (ไม่สามารถใช้ & หน้าตัวแปรได้) เพราะมันไม่ได้มีที่อยู่ในหน่วยความจำนั่นเอง  เรามักใช้ register หน้าตัวแปรที่เราต้องการให้มีการเข้าถึงอย่างรวดเร็ว เช่น ตัวแปร counter ที่เก็บค่าการนับ แต่ทั้งนี้ ทั้งนั้นไม่ใช่ว่าเราจะสามารถประกาศตัวแปรที่เป็น register ได้ทุกตัวที่เราต้องการ เพราะขึ้นอยู่กับฮาร์ดแวร์ของระบบและกฏของ complier นั้นๆ ด้วย 

ดูรูปประกอบ เพื่อความเข้าใจครับ