1. extern
คืออะไร?
ในภาษา C คำว่า extern
คือสัญญาณบอกว่า “กำลังยืมของจากที่อื่น” เพื่อใช้ตัวแปรหรือฟังก์ชันที่ถูกกำหนดไว้ในไฟล์อื่น ตัวอย่างเช่น หากต้องการใช้ตัวแปร global ที่กำหนดในไฟล์หนึ่งจากไฟล์อื่น ก็จะใช้ extern
ในกรณีที่โปรแกรมถูกแบ่งออกเป็นหลายไฟล์ extern
จะช่วยให้สามารถแชร์ข้อมูลระหว่างไฟล์ต่างๆ ได้
ลองจินตนาการว่าในโปรแกรมมีห้องหลายห้อง extern
ทำหน้าที่เหมือน “สัญญาการขอยืมของ” จากห้องข้างๆ หมายถึง “ของนี้ไม่มีในห้องนี้ แต่มีอยู่ในห้องข้างๆ”
ตัวอย่าง
// file1.c
int g_data = 100;
// file2.c
extern int g_data;
void printData() {
printf("%dn", g_data); // เข้าถึง g_data ที่กำหนดไว้ใน file1.c
}
ในตัวอย่างนี้ g_data
ถูกกำหนดใน file1.c
แต่เราเข้าถึงจาก file2.c
ได้โดยใช้ extern

2. ความสัมพันธ์ระหว่าง extern
กับตัวแปร global
extern
มีความสัมพันธ์แน่นแฟ้นกับตัวแปร global เพราะตัวแปร global ถูกกำหนดแค่ครั้งเดียวในโปรแกรมและสามารถเข้าถึงจากไฟล์ไหนก็ได้ อย่างไรก็ตาม หากไม่ใช้ extern
ไฟล์อื่นจะไม่รู้ว่ามีตัวแปรอยู่ที่ไหน จึงต้องประกาศด้วย extern
ว่า “ตัวแปรนี้อยู่ที่นี่!”
โปรดระวัง extern
เป็นเพียง “การประกาศ” ไม่ได้จองพื้นที่หน่วยความจำ การจองพื้นที่จริงจะเกิดขึ้นในไฟล์ต้นทางเท่านั้น
ตัวอย่างตัวแปร global
// file1.c
int counter = 0;
// file2.c
extern int counter; // ใช้ counter ที่ประกาศไว้ในไฟล์อื่น
void incrementCounter() {
counter++; // อัปเดตค่าของ counter
}
3. การใช้ extern
ใน header file
เมื่อโครงการมีขนาดใหญ่ การประกาศตัวแปรหรือฟังก์ชันซ้ำหลายครั้งจะเป็นเรื่องยุ่งยาก จึงมี “header file” ไว้รวมข้อมูลที่จะแชร์ระหว่างไฟล์ต่างๆ โดยการรวมประกาศ extern
ไว้ใน header file ทำให้ไฟล์อื่นๆ สามารถใช้งานตัวแปรหรือฟังก์ชัน global เดียวกันได้
header file เหมือน “กล่องเครื่องมือส่วนกลาง” ที่ทุกไฟล์มาใช้ร่วมกันได้
ตัวอย่าง header file
// globals.h
extern int global_variable;
void printGlobalVariable();
// file1.c
#include "globals.h"
int global_variable = 10;
// file2.c
#include "globals.h"
void printGlobalVariable() {
printf("%dn", global_variable);
}

4. ข้อผิดพลาดที่พบบ่อยเกี่ยวกับ extern
การใช้ extern
มีข้อควรระวัง ตัวอย่างเช่น ห้ามกำหนดค่าเริ่มต้นให้ตัวแปรที่ประกาศด้วย extern
เพราะ extern
เป็นเพียง “การประกาศ” ไม่ใช่ “การกำหนด” และถ้าประกาศ extern
โดยไม่มีตัวแปรต้นทางในไฟล์ใดๆ จะเกิด link error
ข้อผิดพลาดที่พบบ่อย
extern int data = 100; // กำหนดค่าเริ่มต้นแบบนี้ผิด
ถ้าพยายามกำหนดค่าเริ่มต้นแบบนี้จะเกิดข้อผิดพลาด extern
มีไว้เพื่ออ้างอิงตัวแปรที่กำหนดไว้ในไฟล์อื่น ไม่ใช่สำหรับกำหนดหรือกำหนดค่าเริ่มต้น
5. ตัวอย่างการใช้ extern
ในโปรเจกต์จริง
extern
มีประโยชน์อย่างมากในโปรเจกต์ขนาดใหญ่ เช่น โปรแกรมที่ประกอบด้วยหลายโมดูลสามารถแชร์ข้อมูลหรือฟังก์ชันร่วมกันผ่าน extern
ได้
การใช้ extern
ทำให้โปรแกรมเป็นโมดูล แยกไฟล์แต่ยังแชร์ข้อมูลร่วมกันได้ ช่วยให้ดูแลและอ่านโค้ดง่ายขึ้น
ตัวอย่างใช้งานจริง
// main.c
#include "globals.h"
int main() {
printGlobalVariable(); // เรียกฟังก์ชันที่กำหนดในไฟล์อื่น
return 0;
}
// globals.c
#include "globals.h"
int global_variable = 100;
void printGlobalVariable() {
printf("%dn", global_variable); // แสดงค่าตัวแปร global
}
บทความนี้ครอบคลุมตั้งแต่พื้นฐานจนถึงการใช้งาน extern
ในโปรเจกต์จริง การเข้าใจบทบาทของ extern
จะช่วยให้แบ่งและใช้โปรแกรมในภาษา C ได้มีประสิทธิภาพมากขึ้น