C Academy · บทเรียน

extern และการเชื่อมโยง

แบ่งปันสัญลักษณ์ระหว่างไฟล์

บทเรียน 3 จาก 413 ขั้นตอน

extern และการเชื่อมโยง เป็นบทเรียน C Academy ฟรีบน CoddyKit นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน คุณสามารถอ่านบทเรียนทั้งหมดด้านล่างฟรี — จากนั้นลองปฏิบัติด้วยตัวคุณเองในเบราว์เซอร์พร้อมตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7 บทเรียนนี้เป็นส่วนหนึ่งของเส้นทางการเรียน C Academy และความก้าวหน้าของคุณจะซิงค์ข้ามเว็บและแอป CoddyKit คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

การเชื่อมโยงคืออะไร

การเชื่อมโยง อธิบายว่าชื่อหนึ่งสามารถใช้ร่วมกันระหว่างไฟล์ต้นฉบับต่าง ๆ ได้หรือไม่

ชื่อที่มีการเชื่อมโยงภายนอกจะอ้างถึงองค์ประกอบเดียวกันทั่วทั้งโปรแกรม ส่วนชื่อที่มีการเชื่อมโยงภายในจะเป็นส่วนตัวของไฟล์นั้นเอง การทำความเข้าใจการเชื่อมโยงเป็นกุญแจสำคัญของโปรแกรมที่มีหลายไฟล์

การใช้ตัวแปรร่วมกัน

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

ให้ กำหนด ตัวแปรนี้เพียงครั้งเดียว แล้ว ประกาศ ตัวแปรในส่วนอื่นทั้งหมดด้วย extern

/* config.c */
int g_count = 0;   /* the one definition */

คำสำคัญ extern

extern บอกคอมไพเลอร์ว่ามีตัวแปรอยู่ที่อื่นในโปรแกรม โดยไม่สร้างพื้นที่จัดเก็บสำหรับตัวแปรนี้ที่จุดดังกล่าว

นี่เป็นการประกาศเพียงอย่างเดียว ตัวเชื่อมโยงจะจับคู่การอ้างอิงนี้กับการกำหนดเพียงหนึ่งเดียวในไฟล์อื่นภายหลัง

/* other.c */
extern int g_count;   /* declared, not defined */

void bump(void) {
    g_count++;
}

การประกาศในส่วนหัว

รูปแบบที่เป็นระเบียบคือ ใส่การประกาศ extern ไว้ในส่วนหัว และใส่การกำหนดที่ตรงกันไว้ในไฟล์ต้นฉบับเพียงไฟล์เดียวเท่านั้น

จากนั้นไฟล์ใดก็ตามที่รวมส่วนหัวนี้ก็สามารถใช้ตัวแปรร่วมกันได้

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endif

การกำหนดหนึ่งครั้ง การประกาศหลายครั้ง

นี่คือกฎการกำหนดหนึ่งครั้งสำหรับตัวแปรส่วนกลาง: ตัวแปรหนึ่งตัวอาจถูก ประกาศ ด้วย extern ในหลายไฟล์ได้ แต่ต้อง กำหนด ในไฟล์เดียวเท่านั้น

การกำหนดเพียงครั้งเดียว (โดยไม่มี extern) จะจัดสรรพื้นที่จัดเก็บ ส่วนการประกาศด้วย extern ทั้งหมดเป็นเพียงการชี้ไปยังพื้นที่นั้น

/* config.h */ extern int g_count;  /* declaration */
/* config.c */ int g_count = 0;     /* definition  */

ฟังก์ชันก็มีการเชื่อมโยงภายนอกเช่นกัน

โดยค่าเริ่มต้น ฟังก์ชันก็มีการเชื่อมโยงภายนอกเช่นกัน นั่นจึงเป็นเหตุผลที่ต้นแบบในส่วนหัวทำให้ไฟล์อื่นเรียกใช้ฟังก์ชันเหล่านั้นได้

คุณสามารถเขียน extern ไว้หน้าต้นแบบได้ แต่ไม่จำเป็น เพราะฟังก์ชันจะเป็นฟังก์ชันภายนอก เว้นแต่คุณจะระบุเป็นอย่างอื่น

/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);

การเชื่อมโยงภายในด้วย static

คำสำคัญ static ที่ระดับไฟล์ทำให้ชื่อมี การเชื่อมโยงภายใน กล่าวคือ ชื่อนั้นจะมองเห็นได้เฉพาะภายในไฟล์ต้นฉบับของตัวเอง

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

/* parser.c */
static int line_no = 0;   /* private to parser.c */

static void advance(void) {  /* private helper */
    line_no++;
}

extern กับ static

คำสำคัญสองคำนี้อยู่คนละขั้วของการเชื่อมโยง

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

extern int shared_total;   /* visible everywhere */
static int local_cache;    /* only this file */

ข้อผิดพลาดที่พบบ่อย

ผู้เริ่มต้นบางครั้งใส่การกำหนดธรรมดาอย่าง int g_count; ไว้ในส่วนหัว

เนื่องจากส่วนหัวถูกรวมไว้ในหลายไฟล์ แต่ละไฟล์จึงได้รับการกำหนดของตัวเอง และตัวเชื่อมโยงจะแจ้งสัญลักษณ์ซ้ำกัน ให้ประกาศด้วย extern ในส่วนหัวเสมอ และกำหนดเพียงครั้งเดียวในไฟล์ .c

/* WRONG in a header included twice */
int g_count;          /* multiple definition */
/* RIGHT */
extern int g_count;   /* declaration only */

ประกอบทุกส่วนเข้าด้วยกัน

โครงสร้างแบบสามไฟล์นี้เป็นวิธีมาตรฐานในการแบ่งปันสถานะ

ส่วนหัวทำหน้าที่ประกาศ ไฟล์ต้นฉบับหนึ่งไฟล์ทำหน้าที่กำหนด และไฟล์อื่น ๆ ใช้งานหลังจากรวมส่วนหัวแล้ว ตัวเชื่อมโยงจะเชื่อมการอ้างอิงทั้งหมดเข้ากับการกำหนดเพียงหนึ่งเดียว

/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
               int g_count = 0;
/* main.c   */ #include "config.h"
               /* uses g_count */

หมายเหตุเกี่ยวกับการกำหนดค่าเริ่มต้น

เฉพาะการกำหนดจริงเท่านั้นที่ควรระบุค่าเริ่มต้น: int g_count = 0;

การประกาศด้วย extern ต้องไม่กำหนดค่าเริ่มต้น เพราะไม่ได้จัดสรรพื้นที่จัดเก็บ การเขียน extern int g_count = 0; จะทำให้ข้อความนี้กลายเป็นการกำหนด และทำให้จุดประสงค์เดิมหมดไป

extern int g_count;       /* ok: declaration */
extern int g_count = 0;   /* becomes a definition */

ตรวจสอบความเข้าใจ

ตรวจสอบความเข้าใจของคุณเกี่ยวกับ extern และการเชื่อมโยง

ทบทวน

คุณได้เรียนรู้ว่าการเชื่อมโยงควบคุมการมองเห็นข้ามไฟล์ extern ประกาศชื่อที่กำหนดไว้ที่อื่น ส่วน static ที่ระดับไฟล์จะเก็บชื่อไว้เป็นส่วนตัว

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

เริ่มต้นได้ฟรี

เรียนรู้ C ด้วย AI tutor — ฟรี

เขียนและเรียกใช้โค้ดจริงในเบราว์เซอร์ของคุณ รับความช่วยเหลือทันทีจาก AI tutor 24/7 และเรียนรู้ต่อจากที่คุณหยุดบนเว็บหรือในแอป

คอร์ส
39
บทเรียน
144

คำถามที่พบบ่อย

บทเรียน “extern และการเชื่อมโยง” ฟรีหรือไม่

ใช่ — ข้อความเต็มของ “extern และการเชื่อมโยง” ฟรีให้อ่านที่นี่บนเว็บ เพื่อปฏิบัติแบบโต้ตอบ (ตัวแก้ไขโค้ดในตัวและติวเตอร์ AI ตลอด 24/7) และปลดล็อคส่วนที่เหลือของคอร์ส C Academy ให้อัปเกรดเป็น CoddyKit PRO คอร์ส C Academy มีบทเรียนทั้งหมด 4 บทเรียน

คุณจะเรียนรู้อะไรในบทเรียน “extern และการเชื่อมโยง”

แบ่งปันสัญลักษณ์ระหว่างไฟล์ คุณปฏิบัติ C Academy ด้วยโค้ดที่ใช้งานได้จริงที่คุณเรียกใช้โดยตรงในเบราว์เซอร์ และติวเตอร์ AI ตลอด 24/7 ตอบคำถามของคุณขณะที่คุณไปผ่านบทเรียน

คุณต้องมีประสบการณ์ก่อนที่จะเริ่มเรียน C Academy หรือไม่

ไม่จำเป็นต้องมีประสบการณ์มาก่อน C Academy บน CoddyKit ออกแบบมาสำหรับผู้เริ่มต้นไปจนถึงผู้เรียนขั้นสูง คุณสามารถเริ่มต้นที่นี่หรือเริ่มจากตัวแรกและเรียนด้วยความเร็วของคุณเอง นี่คือบทเรียนที่ 3 จากทั้งหมด 4 บทเรียน

บทเรียน “extern และการเชื่อมโยง” ใช้เวลานานแค่ไหน

บทเรียน CoddyKit ส่วนใหญ่ใช้เวลาประมาณ 5–10 นาที แต่ละบทเรียนจึงสั้นและเป็นแบบโต้ตอบ คุณสามารถก้าวหน้าอย่างต่อเนื่องและกลับมาเรียนต่อจากตรงที่เพิ่งหยุดบนเว็บและแอปได้เลย

ฉันเขียนและรันโค้ดในบทเรียน C Academy นี้ได้ไหม

ได้ บทเรียน C Academy ทุกบทมีตัวแก้ไขโค้ดในตัว คุณจึงเขียนและรันโค้ดจริงได้เลยในเบราว์เซอร์ และได้รับข้อเสนอแนะจาก AI ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ

บทเรียนทั้งหมดในหลักสูตรนี้

  1. ไฟล์ส่วนหัวและไฟล์ต้นฉบับ
  2. ตัวป้องกันการรวมไฟล์
  3. extern และการเชื่อมโยง
  4. คอมไพล์หลายไฟล์
← กลับไปที่ C Academy