Rumah >pembangunan bahagian belakang >C++ >Mengapa Tidak Sertakan Pengawal Cegah Pekeliling #include Isu?

Mengapa Tidak Sertakan Pengawal Cegah Pekeliling #include Isu?

Barbara Streisand
Barbara Streisandasal
2024-12-16 21:28:23771semak imbas

Why Don't Include Guards Prevent Circular #include Issues?

Mengapa Tidak Sertakan Pengawal Menyelesaikan Pekeliling #include Isu?

Walaupun menggunakan include guards, isu pekeliling #includes berterusan. Ini kerana prapemproses, yang mengendalikan arahan #include, beroperasi dengan cara yang mendedahkan masalah asas.

Apabila prapemproses menemui pernyataan #include, ia menggantikannya dengan kandungan fail yang ditentukan. Contohnya, jika Physics.h menyertakan GameObject.h, prapemproses akan menggantikan baris #include "GameObject.h" dalam Physics.h dengan kandungan GameObject.h.

Walau bagaimanapun, jika GameObject.h juga termasuk Fizik.h, kebergantungan bulat dicipta. Apabila prapemproses menemui baris #include "Physics.h" dalam GameObject.h, ia cuba menggantikannya dengan kandungan Physics.h, yang menghasilkan gelung tak terhingga kerana Physics.h juga termasuk GameObject.h.

Untuk memahami perkara ini dengan lebih lanjut, pertimbangkan kod berikut:

// Physics.h
#ifndef PHYSICS_H
#define PHYSICS_H
#include "GameObject.h" // Guard is present
#endif

// GameObject.h
#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H
#include "Physics.h" // Guard is also present
#endif

Apabila prapemproses mengendalikan kod ini, ia menghasilkan dalam perkara berikut:

// Physics.h (after preprocessing)
#ifndef PHYSICS_H
#define PHYSICS_H
// (GameObject.h was copy-pasted here)

// (GameObject.h was copy-pasted again)

#endif

// GameObject.h (after preprocessing)
#ifndef GAMEOBJECT_H
#define GAMEOBJECT_H
// (Physics.h was copy-pasted here)

// (Physics.h was copy-pasted again)

#endif

Seperti yang anda lihat, kedua-dua Physics.h dan GameObject.h kini mengandungi salinan antara satu sama lain, mengakibatkan pergantungan bulat.

Untuk menyelesaikan isu ini, adalah penting untuk mengelakkan pekeliling #termasuk dan sebaliknya menggunakan pengisytiharan hadapan. Pengisytiharan hadapan mengisytiharkan kewujudan jenis tanpa menyertakan takrifnya, membenarkan pengkompil untuk meneruskan tanpa memerlukan semua butiran jenis.

Atas ialah kandungan terperinci Mengapa Tidak Sertakan Pengawal Cegah Pekeliling #include Isu?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn