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_'
LK__
sumber
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

uray
sumber
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
30

Anda dapat menonaktifkannya dengan -Wno-reorder.

Lukáš Lalinský
sumber
17

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

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder
pengguna1175197
sumber
7

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

LaszloG
sumber
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.

Drew Noakes
sumber
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!

Anatoly
sumber
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.

Samuel
sumber