Rumah >pembangunan bahagian belakang >C++ >Mengapa Melepasi Const Int Statik melalui Rujukan Menyebabkan Ralat \'Rujukan Tidak Ditakrifkan\' dalam C ?
Rujukan Tidak Ditakrifkan kepada Static Const Int: A Resolution
Dalam senario pengaturcaraan baru-baru ini, ralat kompilasi muncul dengan mesej "Rujukan tidak ditentukan kepada 'Bar::kConst'". Ralat berasal daripada coretan kod berikut:
class Bar { public: static const int kConst = 1; void func() { foo(kConst); // Error-prone line } };
Ralat timbul kerana ahli pemalar statik "kConst" tidak ditakrifkan. Biasanya, pengkompil dijangka membuat penggantian yang diperlukan pada masa penyusunan. Walau bagaimanapun, dalam kes ini, fungsi "foo" mengambil parameter "const int &", menyebabkan pengkompil memihak kepada rujukan berbanding penggantian.
Untuk menyelesaikan isu, pengubahsuaian berikut boleh digunakan:
foo(static_cast<int>(kConst));
Pendekatan ini memaksa pengkompil untuk mencipta "int" sementara dan memberikan rujukan kepadanya, membolehkan penyusunan berjaya.
Tingkah laku yang diperhatikan adalah disengajakan, seperti yang dinyatakan dalam piawaian C ( 9.4.2/4), yang menyatakan bahawa apabila ahli data statik jenis kamiran malar mempunyai pemula malar, ia boleh muncul dalam ungkapan pemalar kamiran. Walau bagaimanapun, ia masih mesti ditakrifkan dalam skop ruang nama jika digunakan dalam atur cara.
Dalam kod yang diberikan, menghantar ahli data statik dengan rujukan tetap merupakan "penggunaan" mengikut piawaian C (3.2/2). Ini bermakna bahawa pengkompil bertanggungjawab untuk menguatkuasakan kehadiran definisi untuk "kConst".
Walaupun GCC kadangkala mengabaikan keperluan ini dalam senario tertentu, secara amnya adalah dinasihatkan untuk mematuhi piawaian dan mengelak daripada menggunakan rujukan kepada atau mengambil alamat objek yang tidak wujud.
Atas ialah kandungan terperinci Mengapa Melepasi Const Int Statik melalui Rujukan Menyebabkan Ralat \'Rujukan Tidak Ditakrifkan\' dalam C ?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!