peringatan gcc "'akan diinisialisasi setelah'


228

Saya mendapatkan banyak peringatan ini dari kode pihak ke-3 yang tidak dapat saya modifikasi. Apakah ada cara untuk menonaktifkan peringatan ini atau setidaknya menonaktifkannya untuk area tertentu (seperti #pragma push / pop di VC ++)?

Contoh:

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after 
list.h:1117: warning:   `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'

Bisakah Anda memposting beberapa baris peringatan yang sebenarnya? Dan juga katakan apakah ini C, C ++, dan jika Anda memiliki sumbernya, apakah peringatan tersebut berasal dari tautan atau proses kompilasi?
csl

Jawaban:


371

Pastikan anggota muncul dalam daftar penginisialisasi dalam urutan yang sama seperti mereka muncul di kelas

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

atau kamu bisa berbalik -Wno-reorder


91
Mengapa ini penting? Mengapa peringatan ini ada?
Eloff

40
@ Eloff Dalam beberapa kasus (tidak direkomendasikan), bdan ainisialisasi mungkin tergantung satu sama lain. Pengguna yang naif mungkin mencoba mengubah urutan inisialisasi untuk mendapatkan efek dan Peringatan akan memperjelas bahwa itu tidak berfungsi.
Gorpik

24
Jadi urutan deklarasi memiliki makna semantik, bahkan jika tidak ada hubungan antara deklarasi tersebut? Tidak ada gunanya!
Cuadue

10
Ini tidak menjelaskan mengapa peringatan ini ada dan mengutip -Wno-reordertanpa menyebutkan masalah apa yang bisa menyebabkan. Saya sadar OP tidak meminta detail lain, tetapi jawaban yang sangat tinggi yang saya harapkan setidaknya menyebutkan konteks dan peringatan di sekitar ini. Bukankah kita seharusnya menjawab pertanyaan yang seharusnya ditulis OP ?
underscore_d

4
@ cp.engr anggota diinisialisasi dalam urutan deklarasi mereka, bukan pesanan mereka dalam init-list - jadi, jika inisialisasi anggota tergantung pada yang lain, tetapi deklarasi tersebut ditukar sehingga yang tergantung akan diinisialisasi setelah dependensinya, seseorang akan mengalami waktu yang sangat buruk segera, karena itu murni UB.
underscore_d


17

Bagi mereka yang menggunakan QT mengalami kesalahan ini, tambahkan ini ke file .pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

gunakan -Wno-reorder(man gcc adalah teman Anda :))


6
Wow, Anda menemukan cara baru untuk mengatakan RT_M: MIYF (pria adalah teman Anda) Jika Anda tidak keberatan, saya akan menggunakannya :)
Oren S

4

Jika Anda melihat kesalahan dari tajuk pustaka dan Anda menggunakan GCC, maka Anda bisa menonaktifkan peringatan dengan memasukkan tajuk yang digunakan -isystemsebagai gantinya -I.

Fitur serupa ada di dentang .

Jika Anda menggunakan CMake, Anda dapat menentukan SYSTEMuntuk include_directories.


Bisakah Anda menjelaskan cara "menentukan SYSTEM"?
einpoklum

1
Cukup letakkan string `SYSTEM` di akhir include_directoriesbaris.
Drew Noakes

1

Urutan inisialisasi tidak masalah. Semua bidang diinisialisasi dalam urutan definisi mereka di kelas / struct mereka. Tetapi jika urutan dalam daftar inisialisasi berbeda gcc / g ++ menghasilkan peringatan ini. Hanya ubah urutan inisialisasi untuk menghindari peringatan ini. Tetapi Anda tidak dapat mendefinisikan bidang menggunakan inisialisasi sebelum konstruksinya. Ini akan menjadi kesalahan runtime. Jadi, Anda mengubah urutan definisi. Hati-hati dan jaga perhatian!


OP ingin tahu cara menonaktifkan peringatan, bukan apa artinya atau cara memperbaiki kode. Bahkan, pos tersebut mengatakan bahwa kode tersebut adalah pihak ketiga dan tidak dapat dimodifikasi. Mereka tidak dapat mengubah urutan definisi dan mungkin juga bukan urutan inisialisasi.
Tim Seguine

sangat banyak tidak masalah jika 2 objek dalam daftar init adalah initd dari objek 1, tapi mereka menyatakan dengan cara yang salah di dalam header. dalam hal ini, semuanya bisa menjadi sangat aneh.
underscore_d

0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

urutannya penting karena jika a diinisialisasi sebelum b, dan a bergantung pada b. perilaku yang tidak terdefinisi akan muncul.

Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.