C Academy · Pelajaran

Pengawal Include

Halang penyertaan berganda.

Pelajaran 2 daripada 413 langkah

Pengawal Include ialah pelajaran C Academy percuma di CoddyKit. Ini ialah pelajaran 2 daripada 4. Anda boleh membaca keseluruhan pelajaran di bawah secara percuma — kemudian berlatih secara praktikal dalam pelayar menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7. Pelajaran ini merupakan sebahagian daripada laluan pembelajaran C Academy, dan kemajuan anda disegerakkan merentas web serta aplikasi CoddyKit. Kursus C Academy merangkumi sejumlah 4 pelajaran.

Masalah Penyertaan Berganda

Pengepala sering menyertakan pengepala lain. Satu pengepala boleh termasuk dua kali dalam fail sumber yang sama dengan mudah.

Apabila hal ini berlaku, setiap pengisytiharan di dalamnya muncul dua kali. Bagi takrif jenis seperti struct atau typedef, ini ialah ralat penyusunan: sesuatu jenis tidak boleh ditakrifkan lebih daripada sekali.

Cara Ia Berlaku Tanpa Disedari

Katakan a.h dan b.h kedua-duanya menyertakan types.h. Fail sumber yang menyertakan kedua-duanya akhirnya mempunyai types.h yang ditampal dua kali.

Prapemproses menyalin teks pengepala secara membuta tuli, lalu takrif dalam types.h menjadi pendua dan mencetuskan ralat pentakrifan semula.

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

Pengawal Penyertaan

Pengawal penyertaan ialah helah kecil prapemproses yang menjadikan pengepala selamat untuk disertakan berkali-kali.

Ia membungkus seluruh pengepala dalam syarat supaya badan hanya diproses pada kali pertama. Penyertaan seterusnya dilangkau sepenuhnya.

#ifndef TYPES_H
#define TYPES_H

/* header contents here */

#endif /* TYPES_H */

Cara Pengawal Berfungsi

Pada kali pertama pengepala ditemui, TYPES_H belum ditakrifkan, jadi #ifndef adalah benar dan badan diproses. Kemudian #define menetapkan makro tersebut.

Pada mana-mana penyertaan seterusnya, TYPES_H sudah wujud, jadi #ifndef adalah palsu dan prapemproses melangkau terus ke #endif.

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

Pengepala dengan Pengawal Lengkap

Berikut ialah pengepala yang realistik dengan pengawal yang melindungi takrif jenis.

Walaupun banyak fail menyertakan point.h secara langsung atau tidak langsung, struct Point ditakrifkan tepat sekali bagi setiap unit terjemahan.

/* 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 pengawal mestilah unik di seluruh projek anda, jika tidak dua pengepala boleh bertembung dan menyembunyikan satu sama lain secara senyap.

Konvensyen biasa menghasilkan nama daripada nama fail dalam huruf besar: point.h menjadi POINT_H, manakala net/socket.h menjadi NET_SOCKET_H.

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

Elakkan Nama Terpelihara

Pengecam yang bermula dengan garis bawah diikuti huruf besar, atau yang mengandungi garis bawah berganda, dikhaskan untuk pengkompil dan pustaka standard.

Elakkan pengawal seperti __POINT_H__. Bentuk biasa dengan garis bawah di hujung seperti POINT_H adalah selamat dan jelas.

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

Alternatif #pragma once

Kebanyakan pengkompil moden menyokong #pragma once, iaitu satu baris di bahagian atas pengepala yang menjalankan tugas yang sama.

Ia lebih ringkas dan mengelakkan pertembungan nama, tetapi bukan sebahagian daripada piawaian C. Pengawal #ifndef tradisional berfungsi di mana-mana.

/* point.h */
#pragma once

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

Pengawal berbanding Pragma

Pengawal #ifndef mudah alih sepenuhnya dan mengikut piawaian, tetapi memerlukan makro unik bagi setiap pengepala.

#pragma once ringkas dan bebas pertembungan, tetapi bergantung pada sokongan pengkompil. Sesetengah projek menggunakan kedua-duanya: pragma bersama pengawal klasik untuk keselamatan maksimum.

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

Pengawal adalah bagi Setiap Unit Terjemahan

Pengawal penyertaan menghalang penyertaan pendua dalam satu fail sumber semasa fail itu disusun.

Ia tidak menghalang pengepala daripada diproses sekali dalam setiap fail .c yang berasingan. Itu tidak mengapa kerana setiap fail sumber ialah unit terjemahan yang berbeza.

Jadikannya Kebiasaan

Tambahkan pengawal penyertaan pada setiap pengepala yang anda tulis, bermula dari baris pertama. Ia hanya menggunakan tiga baris dan menghalang pelbagai ralat yang mengelirukan.

Walaupun pengepala ringkas boleh disertakan secara tidak langsung melalui pengepala lain kemudian, melindunginya dari awal menjimatkan masalah.

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

Semakan Pantas

Semak pemahaman anda tentang pengawal penyertaan.

Rumusan

Anda telah belajar mengapa menyertakan pengepala dua kali menyebabkan ralat pentakrifan semula dan cara pengawal penyertaan menghalangnya.

Gunakan #ifndef/#define/#endif dengan makro unik, atau #pragma once. Seterusnya, kita akan melihat cara berkongsi pemboleh ubah antara fail dengan extern.

Percuma untuk bermula

Pelajari C dengan tutor kecerdasan buatan — percuma

Tulis dan jalankan kod sebenar dalam pelayar anda, dapatkan bantuan segera daripada tutor kecerdasan buatan yang tersedia 24/7, dan sambung semula dari tempat anda berhenti di web atau dalam aplikasi.

Kursus
39
Pelajaran
144

Soalan Lazim

Adakah pelajaran “Pengawal Include” percuma?

Ya — teks penuh “Pengawal Include” boleh dibaca secara percuma di web ini. Untuk berlatih secara interaktif menggunakan penyunting kod terbina dalam dan tutor kecerdasan buatan 24/7, serta membuka kunci baki kursus C Academy, tingkat taraf kepada CoddyKit PRO. Kursus C Academy merangkumi sejumlah 4 pelajaran.

Apakah yang akan saya pelajari dalam “Pengawal Include”?

Halang penyertaan berganda. Anda berlatih C Academy menggunakan kod praktikal yang dijalankan terus dalam pelayar, manakala tutor kecerdasan buatan 24/7 menjawab soalan anda semasa anda mengikuti pelajaran.

Adakah saya memerlukan pengalaman untuk memulakan C Academy?

Tiada pengalaman terdahulu diperlukan. Pembelajaran C Academy di CoddyKit disusun untuk pelajar daripada peringkat pemula hingga lanjutan, jadi anda boleh bermula di sini atau dari awal dan belajar mengikut kadar anda sendiri. Ini ialah pelajaran 2 daripada 4.

Berapa lamakah pelajaran “Pengawal Include” diambil?

Kebanyakan pelajaran CoddyKit mengambil masa kira-kira 5–10 minit. Setiap pelajaran ringkas dan interaktif, jadi anda boleh membuat kemajuan secara berterusan dan menyambung tepat dari tempat anda berhenti di web atau aplikasi.

Bolehkah saya menulis dan menjalankan kod dalam pelajaran C Academy ini?

Ya. Setiap pelajaran C Academy menyertakan penyunting kod terbina dalam, jadi anda boleh menulis dan menjalankan kod sebenar terus dalam pelayar serta menerima maklum balas kecerdasan buatan serta-merta — tanpa memerlukan persediaan setempat.

Semua pelajaran dalam kursus ini

  1. Fail Header dan Sumber
  2. Pengawal Include
  3. extern dan Pautan
  4. Menyusun Pelbagai Fail
← Kembali ke C Academy