การใช้ extern ในภาษา C: วิธีแชร์ตัวแปรและฟังก์ชันระหว่างหลายไฟล์อย่างถูกต้อง

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 ได้มีประสิทธิภาพมากขึ้น