extern dan Penautan
Bagikan simbol antarberkas.
extern dan Penautan adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 3 dari 4. Kamu bisa membaca pelajaran lengkapnya di bawah secara gratis — lalu praktikkan langsung di browser dengan editor kode bawaan dan tutor AI 24/7. Ini adalah bagian dari jalur belajar C Academy, dan progresmu tersinkronisasi di web dan aplikasi CoddyKit. Kursus C Academy mencakup 4 pelajaran total.
Apa Itu Linkage?
Linkage menjelaskan apakah sebuah nama dapat digunakan bersama di antara berkas sumber yang berbeda.
Nama dengan linkage eksternal merujuk pada entitas yang sama di seluruh program. Nama dengan linkage internal bersifat privat untuk berkasnya sendiri. Memahami linkage merupakan kunci untuk program yang terdiri dari banyak berkas.
Berbagi Variabel
Misalkan dua berkas perlu mengakses satu penghitung global. Anda tidak dapat begitu saja mendefinisikannya di kedua berkas; tindakan itu membuat dua variabel terpisah dan menyebabkan galat penautan simbol duplikat.
Sebagai gantinya, Anda mendefinisikannya sekali dan mendeklarasikannya di tempat lain dengan extern.
/* config.c */
int g_count = 0; /* the one definition */Kata Kunci extern
extern memberi tahu kompilator bahwa sebuah variabel ada di tempat lain dalam program, tanpa membuat penyimpanan untuknya di sini.
Ini adalah deklarasi murni. Penaut kemudian menyelesaikannya ke satu-satunya definisi di berkas lain.
/* other.c */
extern int g_count; /* declared, not defined */
void bump(void) {
g_count++;
}Deklarasi dalam Tajuk
Pola yang rapi: letakkan deklarasi extern dalam sebuah tajuk, dan definisi yang cocok tepat di satu berkas sumber.
Berkas apa pun yang menyertakan tajuk tersebut kemudian dapat menggunakan variabel bersama itu.
/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
extern int g_count;
#endifSatu Definisi, Banyak Deklarasi
Inilah Aturan Satu Definisi untuk variabel global: sebuah variabel boleh dideklarasikan dengan extern di banyak berkas, tetapi hanya boleh didefinisikan di satu berkas.
Definisi tunggal tersebut (tanpa extern) mengalokasikan penyimpanan. Semua deklarasi extern hanya menunjuk ke definisi itu.
/* config.h */ extern int g_count; /* declaration */
/* config.c */ int g_count = 0; /* definition */Fungsi Juga Memiliki Keterkaitan Eksternal
Secara bawaan, fungsi juga memiliki keterkaitan eksternal. Karena itu, prototipe dalam tajuk memungkinkan berkas lain memanggilnya.
Anda boleh menulis extern sebelum prototipe, tetapi itu berlebihan; fungsi bersifat eksternal kecuali Anda menyatakan sebaliknya.
/* both forms mean the same */
int add(int a, int b);
extern int add(int a, int b);Keterkaitan Internal dengan static
Kata kunci static pada lingkup berkas memberikan sebuah nama keterkaitan internal: nama tersebut hanya terlihat di dalam berkas sumbernya sendiri.
Gunakan ini untuk helper dan variabel global yang harus tetap privat bagi sebuah modul. Berkas lain tidak dapat melihat atau berbenturan dengannya.
/* parser.c */
static int line_no = 0; /* private to parser.c */
static void advance(void) { /* private helper */
line_no++;
}extern vs static
Kedua kata kunci ini berada di ujung keterkaitan yang berlawanan.
extern meminta keterkaitan eksternal: bagikan nama ini ke seluruh berkas. static pada lingkup berkas memaksa keterkaitan internal: jaga nama ini tetap privat. Pemilihan yang tepat mengendalikan hal-hal yang diekspos modul Anda.
extern int shared_total; /* visible everywhere */
static int local_cache; /* only this file */Kesalahan Umum
Pemula terkadang menempatkan definisi biasa seperti int g_count; dalam sebuah tajuk.
Karena tajuk tersebut disertakan dalam beberapa berkas, setiap berkas mendapatkan definisinya sendiri dan penaut melaporkan simbol duplikat. Selalu deklarasikan dengan extern dalam tajuk, lalu definisikan sekali dalam berkas .c.
/* WRONG in a header included twice */
int g_count; /* multiple definition */
/* RIGHT */
extern int g_count; /* declaration only */Menyatukan Semuanya
Bentuk tiga berkas ini adalah cara standar untuk berbagi keadaan.
Tajuk melakukan deklarasi, satu berkas sumber melakukan definisi, dan berkas lainnya menggunakannya setelah menyertakan tajuk tersebut. Penaut menyatukan semua referensi ke definisi tunggal itu.
/* config.h */ extern int g_count;
/* config.c */ #include "config.h"
int g_count = 0;
/* main.c */ #include "config.h"
/* uses g_count */Catatan tentang Inisialisasi
Hanya definisi sebenarnya yang boleh memberikan nilai awal: int g_count = 0;.
Deklarasi extern tidak boleh melakukan inisialisasi karena tidak mengalokasikan penyimpanan. Menulis extern int g_count = 0; mengubahnya menjadi definisi dan menggagalkan tujuan penggunaan extern.
extern int g_count; /* ok: declaration */
extern int g_count = 0; /* becomes a definition */Periksa Cepat
Periksa pemahaman Anda tentang extern dan keterkaitan.
Ringkasan
Anda telah mempelajari bahwa keterkaitan mengendalikan visibilitas lintas berkas. extern mendeklarasikan nama yang didefinisikan di tempat lain; static pada lingkup berkas menjaga nama tetap privat.
Bagikan variabel global dengan satu definisi dan deklarasi extern. Selanjutnya, kita akan mengompilasi dan menautkan berkas-berkas ini menjadi sebuah program.
Pertanyaan yang Sering Diajukan
Apakah pelajaran “extern dan Penautan” gratis?
Ya — teks lengkap “extern dan Penautan” gratis dibaca di sini di web. Untuk praktiknya secara interaktif (editor kode bawaan dan tutor AI 24/7) dan buka sisa kursus C Academy, upgrade ke CoddyKit PRO. Kursus C Academy mencakup 4 pelajaran total.
Apa yang akan aku pelajari di “extern dan Penautan”?
Bagikan simbol antarberkas. Kamu berlatih C Academy dengan kode praktik yang langsung kamu jalankan di browser, dan tutor AI 24/7 menjawab pertanyaanmu saat kamu mengerjakan pelajaran ini.
Apakah aku perlu pengalaman untuk memulai C Academy?
Tidak diperlukan pengalaman sebelumnya. C Academy di CoddyKit dirancang untuk pemula hingga pelajar tingkat lanjut, jadi kamu bisa memulai di sini atau dari awal dan belajar sesuai kecepatan kamu sendiri. Ini adalah pelajaran 3 dari 4.
Berapa lama pelajaran “extern dan Penautan” memakan waktu?
Sebagian besar pelajaran CoddyKit memakan waktu sekitar 5–10 menit. Setiap pelajaran ringkas dan interaktif, jadi kamu membuat kemajuan stabil dan melanjutkan dari tempat kamu tinggalkan di web dan aplikasi.
Bisakah aku menulis dan menjalankan kode dalam pelajaran C Academy ini?
Ya. Setiap pelajaran C Academy menyertakan editor kode bawaan, jadi kamu menulis dan menjalankan kode nyata langsung di browser dan mendapatkan umpan balik AI instan — tidak diperlukan penyiapan lokal.
Semua pelajaran dalam kursus ini
- Berkas Header dan Sumber
- Penjaga Penyertaan
- extern dan Penautan
- Mengompilasi Banyak Berkas