gcc uyarısı "", '


228

Bu uyarıların çoğunu değiştiremediğim 3. taraf kodundan alıyorum. Bu uyarıyı devre dışı bırakmanın veya en azından belirli alanlar için devre dışı bırakmanın bir yolu var mı (VC ++'daki #pragma push / pop gibi)?

Misal:

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

Lütfen gerçek uyarıların birkaç satırını gönderebilir misiniz? Ve ayrıca bunun C, C ++ olup olmadığını ve kaynağınız varsa, uyarı bağlayıcıdan veya derleme işleminden geliyorsa söyle?
csl

Yanıtlar:


371

Üyelerin başlatıcı listesinde sınıfta göründükleri sırayla göründüğünden emin olun

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

ya da dönebilirsin -Wno-reorder


91
Bu neden önemli? Bu uyarı neden var?
Eloff

40
@Eloff Bazı durumlarda (önerilmez) bve abaşlatılması birbirine bağlı olabilir. Saf bir kullanıcı, bir etki elde etmek için başlatma sırasını değiştirmeye çalışabilir ve Uyarı, çalışmadığını açıkça belirtir.
Gorpik

24
Yani, beyannameler arasında bir ilişki olmasa bile, beyannamenin semantik anlamı var mı? Ne kadar anlamsız!
Cuadue

10
Bu, bu uyarının neden var olduğunu ve -Wno-reorderhangi sorunlara yol açabileceğinden bahsetmeden neden alıntı yaptığını açıklamaz. OP'nin başka bir ayrıntı istemediğinin farkındayım, ama en azından bu bağlamdaki bağlamı ve uyarıları belirtmeyi umduğum bu oy çok yüksek. OP'nin yazması gereken soruyu cevaplamamız gerekmiyor mu?
underscore_d

4
@ cp.engr üyeleri, başlatma listesindeki sıralarıyla değil, bildirimleri sırasına göre başlatılır - bu nedenle, bir üyenin başlatılması bir başkasına bağlıysa, ancak bağımlılar bağımlı olduktan sonra başlatıldığı için bildirimler değiştirilir. çok yakında çok kötü zaman geçirecek, çünkü bu saf UB.
underscore_d


17

Bu hatayı QT kullanan kullanıcılar için, bunu .pro dosyasına ekleyin

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

kullanın -Wno-reorder(erkek gcc senin arkadaşın :))


6
Vay canına, RT_M demenin yeni bir yolunu buldun: MIYF (erkek arkadaşın) Eğer sakıncası yoksa, onu kullanacağım :)
Oren S

4

Kütüphane başlıklarından hatalar görüyorsanız ve GCC kullanıyorsanız, -isystemyerine yerine başlıkları ekleyerek uyarıları devre dışı bırakabilirsiniz -I.

Clang'da benzer özellikler var .

CMake kullanıyorsanız, SYSTEMiçin belirtebilirsiniz include_directories.


Nasıl "belirtileceğini SYSTEM" açıklayabilir misiniz ?
einpoklum

1
Çizginin sonuna "SYSTEM" dizesini koymanız yeterlidir include_directories.
Drew Noakes

1

Başlatma sırası önemli değil. Tüm alanlar, sınıflarında / yapılarında tanımlarına göre başlatılır. Ancak başlatma listesindeki sıra farklıysa gcc / g ++ bu uyarıyı oluşturur. Başlatma sırasını yalnızca bu uyarıyı önlemek için değiştirin. Ancak, yapısından önce başlatma sırasında alanı kullanarak tanımlayamazsınız. Bir çalışma zamanı hatası olacaktır. Yani tanım sırasını değiştirirsiniz. Dikkatli olun ve dikkat edin!


OP, uyarının nasıl devre dışı bırakılacağını, ne anlama geldiğini veya kodun nasıl düzeltileceğini bilmek istedi. Aslında, yazı kodun üçüncü taraf olduğunu ve değiştirilemeyeceğini söylüyor. Tanımlama sırasını değiştiremezler ve muhtemelen başlatma sırasını da değiştiremezler.
Tim Seguine

bunu çok yapar init listesinde 2 nesne 1 nesneden initd eğer olursa olsun, ancak başlıkta etrafında yanlış bir şekilde beyan ediyoruz. bu durumda işler çok garipleşebilir.
underscore_d

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

sıra önemlidir, çünkü a b'den önce başlatılırsa ve a b'ye bağımlıysa. tanımlanmamış davranış görünecektir.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.