Catatan
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba masuk atau mengubah direktori.
Akses ke halaman ini memerlukan otorisasi. Anda dapat mencoba mengubah direktori.
Penginisialisasi global mengakses objek ekstern 'simbol' (i.22)
C++ Pedoman Inti: I.22: Hindari inisialisasi kompleks objek global
Objek global dapat diinisialisasi dalam urutan yang tidak konsisten atau tidak terdefinisi, yang berarti bahwa interdependensi di antara mereka berisiko dan harus dihindari. Pedoman ini berlaku ketika penginisialisasi merujuk ke objek lain yang dianggap extern.
Keterangan
Objek dianggap extern jika sesuai dengan aturan berikut:
- ini adalah variabel global yang ditandai dengan
externpenentu atau merupakan anggota statis kelas; - tidak ada di namespace anonim;
- tidak ditandai sebagai
const; - Anggota kelas statis dianggap global, sehingga inisialisasi mereka juga diperiksa.
Nama analisis kode: NO_GLOBAL_INIT_EXTERNS
Contoh
Pemeriksaan versi eksternal:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode = api_version <= API_LEGACY_VERSION; // C26427, also stale value
Pemeriksaan versi eksternal dibuat lebih dapat diandalkan:
// api.cpp
int api_version = API_DEFAULT_VERSION; // Assume it can change at run time, hence non-const.
// client.cpp
extern int api_version;
bool is_legacy_mode() noexcept
{
return api_version <= API_LEGACY_VERSION;
}