26 April 2012

[C] จัดการ Source code หลายไฟล์ ตอนที่ 3

วันนี้มาเล่าต่อว่า จะทำยังไง ถ้าต้องการแลกเปลี่ยนข้อมูลระหว่างโปรแกรมที่เขียนแยกไว้หลายๆ ไฟล์ หรือต้องการมีตัวแปรแบบ global ที่สามารถเรียกค่าของตัวแปรจากฟังก์ชันหลายๆ ฟังก์ชันที่อยู่คนละไฟล์

ภาษา C ยอมให้ประกาศตัวแปรแบบ global โดยใช้ keyword "extern" เพื่อระบุว่ามีตัวแปรนี้อยู่แล้ว เพียงแต่อ้างถึงตัวแปรตัวเดียวกันนี้ที่ถูกประกาศไว้ที่อื่น ลองดูตัวอย่างโปรแกรมข้างล่างนี้

/* foo.c */
#include<stdio.h>
void func();
int i = 10;
main() {
 printf("i = %d\n", i);
 func();
 return 0;
}

/* bar.c */
#include<stdio.h>

extern int i;

void func() {
 printf("i = %d\n", i);
}

เมื่อคอมไพล์โปรแกรมนี้ gcc foo.c bar.c จะได้ผลเป็น

i = 10
i = 10

เพราะตัวแปร i ที่อ้างถึงทั้งในฟังก์ชัน main และ func เป็นตัวแปรเดียวกัน จึงแสดงค่า เท่ากับ 10 เหมือนกันทั้งสองบรรทัด มีข้อกำหนดเกี่ยวกับตัวแปร extern อีกเล็กน้อย คือ ตัวแปรที่ประกาศเป็น extern จะไม่สามารถกำหนดค่าเริ่มต้นให้ได้ เนื่องจากตัวแปรนั้นไม่ใช่ตัวแปรจริง เป็นแค่การอ้างถึงตัวแปรที่ประกาศไว้ที่อื่น

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

No comments: