0Pricing
C Academy · Pelajaran

Penjaga Penyertaan

Cegah penyertaan ganda.

Penjaga Penyertaan adalah pelajaran C Academy gratis di CoddyKit. Ini adalah pelajaran 2 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.

Masalah Penyertaan Ganda

Header sering menyertakan header lain. Akibatnya, satu header dapat dengan mudah disertakan dua kali dalam berkas sumber yang sama.

Jika itu terjadi, setiap deklarasi di dalamnya muncul dua kali. Untuk definisi tipe seperti struct atau typedef, hal ini merupakan kesalahan kompilasi: sebuah tipe tidak dapat didefinisikan lebih dari satu kali.

Bagaimana Masalah Ini Terjadi

Misalkan a.h dan b.h sama-sama menyertakan types.h. Berkas sumber yang menyertakan keduanya akhirnya memiliki salinan types.h dua kali.

Praprosesor menyalin teks header begitu saja, sehingga definisi dalam types.h menjadi duplikat dan memicu kesalahan definisi ulang.

/* a.h */ #include "types.h"
/* b.h */ #include "types.h"
/* main.c */
#include "a.h"
#include "b.h"   /* types.h now seen twice */

Penjaga Penyertaan

Penjaga penyertaan adalah trik kecil praprosesor yang membuat header aman disertakan berkali-kali.

Penjaga ini membungkus seluruh header dalam kondisi tertentu sehingga isinya hanya diproses pada kali pertama. Penyertaan berikutnya dilewati sepenuhnya.

#ifndef TYPES_H
#define TYPES_H

/* header contents here */

#endif /* TYPES_H */

Cara Kerja Penjaga

Saat header pertama kali ditemukan, TYPES_H belum didefinisikan, sehingga #ifndef bernilai benar dan isinya diproses. Kemudian #define menetapkan makro tersebut.

Pada penyertaan berikutnya, TYPES_H sudah ada, sehingga #ifndef bernilai salah dan praprosesor melompat ke #endif.

#ifndef TYPES_H   /* true only the first time */
#define TYPES_H   /* remember we've been here */
/* ... body ... */
#endif

Header dengan Penjaga Lengkap

Berikut contoh header yang realistis dengan penjaga untuk melindungi definisi tipe.

Meskipun banyak berkas menyertakan point.h secara langsung atau tidak langsung, struct Point didefinisikan tepat satu kali untuk setiap unit translasi.

/* point.h */
#ifndef POINT_H
#define POINT_H

typedef struct {
    int x;
    int y;
} Point;

Point point_add(Point a, Point b);

#endif

Memilih Nama Makro

Makro penjaga harus unik di seluruh proyek Anda, jika tidak, dua header dapat berbenturan dan diam-diam saling menyembunyikan.

Konvensi yang umum adalah membentuk nama dari nama berkas dalam huruf besar: point.h menjadi POINT_H, sedangkan net/socket.h menjadi NET_SOCKET_H.

#ifndef NET_SOCKET_H
#define NET_SOCKET_H
/* ... */
#endif

Hindari Nama yang Dicadangkan

Pengenal yang diawali garis bawah diikuti huruf kapital, atau yang mengandung garis bawah ganda, dicadangkan untuk kompilator dan pustaka standar.

Hindari penjaga seperti __POINT_H__. Bentuk biasa dengan garis bawah di akhir seperti POINT_H aman dan jelas.

#ifndef _POINT_H_   /* risky: reserved name pattern */
#ifndef POINT_H     /* preferred */

Alternatif #pragma once

Sebagian besar kompilator modern mendukung #pragma once, yaitu satu baris di bagian atas header yang melakukan tugas yang sama.

Bentuk ini lebih singkat dan menghindari benturan nama, tetapi bukan bagian dari standar C. Penjaga #ifndef tradisional dapat digunakan di mana saja.

/* point.h */
#pragma once

typedef struct { int x; int y; } Point;

Penjaga vs Pragma

Penjaga #ifndef sepenuhnya portabel dan standar, tetapi memerlukan makro unik untuk setiap header.

#pragma once ringkas dan bebas benturan, tetapi bergantung pada dukungan kompilator. Beberapa proyek menggunakan keduanya: pragma dan penjaga klasik untuk keamanan maksimum.

#pragma once
#ifndef POINT_H
#define POINT_H
/* ... */
#endif

Penjaga Berlaku per Unit Translasi

Penjaga penyertaan mencegah penyertaan ganda dalam satu berkas sumber saat berkas tersebut dikompilasi.

Penjaga ini tidak mencegah sebuah header diproses satu kali di setiap berkas .c yang terpisah. Hal itu wajar karena setiap berkas sumber merupakan unit translasi yang berbeda.

Jadikan Kebiasaan

Tambahkan penjaga penyertaan ke setiap header yang Anda tulis, mulai dari baris pertama. Penjaga ini hanya memerlukan tiga baris dan mencegah banyak kesalahan membingungkan.

Bahkan header sederhana nantinya dapat disertakan secara tidak langsung melalui header lain, sehingga memasang penjaga sejak awal menghemat masalah.

/* config.h */
#ifndef CONFIG_H
#define CONFIG_H
#define MAX_USERS 100
#endif

Pemeriksaan Singkat

Periksa pemahaman Anda tentang penjaga penyertaan.

Ringkasan

Anda telah mempelajari alasan penyertaan header dua kali menyebabkan kesalahan definisi ulang dan cara penjaga penyertaan mencegahnya.

Gunakan #ifndef/#define/#endif dengan makro unik, atau #pragma once. Selanjutnya kita akan melihat cara berbagi variabel antarberkas dengan extern.

Pertanyaan yang Sering Diajukan

Apakah pelajaran “Penjaga Penyertaan” gratis?

Ya — teks lengkap “Penjaga Penyertaan” 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 “Penjaga Penyertaan”?

Cegah penyertaan ganda. 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 2 dari 4.

Berapa lama pelajaran “Penjaga Penyertaan” 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

  1. Berkas Header dan Sumber
  2. Penjaga Penyertaan
  3. extern dan Penautan
  4. Mengompilasi Banyak Berkas
← Kembali ke C Academy