extern และการเชื่อมโยง
แบ่งปันสัญลักษณ์ระหว่างไฟล์
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 ในทันที — ไม่ต้องติดตั้งในเครื่องของคุณ
บทเรียนทั้งหมดในหลักสูตรนี้
- ไฟล์ส่วนหัวและไฟล์ต้นฉบับ
- ตัวป้องกันการรวมไฟล์
- extern และการเชื่อมโยง
- คอมไพล์หลายไฟล์