Derleyici Uyarısı (düzey 4) C4471
'sabit listesi': kapsamsız bir numaralandırmanın ileriye dönük bildiriminde temel alınan bir tür olmalıdır (int varsayılır)
Temel alınan tür için tanımlayıcı olmadan kapsamsız bir numaralandırmanın ileriye doğru bildirimi bulundu. Varsayılan olarak, Visual C++ bir sabit listesi için temel alınan tür olduğunu varsayar int
. Numaralandırma tanımında farklı bir tür kullanılıyorsa, örneğin, farklı bir açık tür belirtilirse veya bir başlatıcı tarafından örtük olarak ayarlanmışsa, bu sorunlara neden olabilir. Taşınabilirlik sorunlarınız da olabilir; diğer derleyiciler bir numaralandırmanın temel türü olduğunu varsaymaz int
.
Bu uyarı varsayılan olarak kapalıdır; Komut satırında etkinleştirmek için /Wall veya /wN4471 kullanabilir veya kaynak dosyanızda #pragma uyarısını kullanabilirsiniz.
Örnekler
Bazı durumlarda, bu uyarı sahtedir. Tanımdan sonra bir numaralandırma için ileriye doğru bildirim görüntülenirse, bu uyarı tetiklenebilir. Örneğin, bu kod C4471'e neden olsa da geçerlidir:
// C4471a.cpp
// Compile with: cl /c /w14471 C4471a.cpp
enum Example { item = 0x80000000UL };
enum Example; // Spurious C4471
// ...
Genel olarak, ileriye doğru bildirim yerine kapsamsız bir numaralandırma için tam tanımı kullanmak güvenlidir. Tanımı bir üst bilgi dosyasına ekleyebilir ve buna başvuran kaynak dosyalara ekleyebilirsiniz. Bu, C++98 ve üzeri için yazılmış kodda çalışır. Taşınabilirlik ve bakım kolaylığı için bu çözümü öneririz.
// C4471b.cpp
// Compile with: cl /c /w14471 C4471b.cpp
enum Example; // C4471
// To fix, replace the line above with the enumeration definition:
// enum Example { item = 0x80000000UL };
// ...
C++11'de, kapsamsız bir sabit listesine ve ileriye doğru bildirimine açık bir tür ekleyebilirsiniz. Bu çözümün yalnızca karmaşık üst bilgi ekleme mantığının ileriye doğru bildirim yerine tanımın kullanılmasını engellemesi durumunda öneririz. Bu çözüm bir bakım sorununa yol açabilir: Numaralandırma tanımı için kullanılan temel türü değiştirirseniz, tüm iletme bildirimlerini de eşleşecek şekilde değiştirmeniz gerekir, aksi takdirde kodunuzda sessiz hatalar olabilir. Bu sorunu en aza indirmek için ileri bildirimini bir üst bilgi dosyasına yerleştirebilirsiniz.
Kaynak dosya C4471c.cpp
:
// C4471c.cpp
// Client code for enumeration defined in C4471d.cpp
// Compile with: cl /c /w14471 C4471c.cpp C4471d.cpp
enum Example; // C4471, int assumed
// To fix, replace the lines above with the forward declarations:
// enum Example : unsigned;
// ...
Kaynak dosya C4471d.cpp
:
// C4471d.cpp
// Definition for enumeration used in C4471c.cpp
// Compile with: cl /c /w14471 C4471c.cpp C4471d.cpp
enum Example : unsigned { item = 0x80000000 }; // explicit type
// ...
Numaralandırma için açık bir tür belirtirseniz, varsayılan olarak açık olan C4369 uyarısını da etkinleştirmenizi öneririz. Bu, bir numaralandırma öğesinin açıkça belirtilen türden farklı bir tür gerektirdiği durumları tanımlar.
Kodunuzu C++11'de yeni olan kapsamlı bir sabit listesi kullanacak şekilde değiştirebilirsiniz. Hem tanım hem de numaralandırma türünü kullanan tüm istemci kodları kapsamlı bir sabit listesi kullanacak şekilde değiştirilmelidir. Tanımlı sabit listesi öğelerinin adları sabit listesi kapsamıyla sınırlı olduğundan, ad alanı kirliliğiyle ilgili sorunlarınız varsa kapsamlı bir sabit listesi kullanmanızı öneririz. Kapsamı belirlenmiş bir numaralandırmanın bir diğer özelliği de üyelerinin örtük olarak başka bir tam sayıya veya sabit listesi türüne dönüştürülememeleridir ve bu da ince hataların kaynağı olabilir.
Kaynak dosya C4471e.cpp
:
// C4471e.cpp
// Client code for scoped enumeration defined in C4471f.cpp
// Compile with: cl /c /w14471 C4471e.cpp C4471f.cpp
enum Example; // C4471
// To fix, replace the line above with the forward declaration:
// enum class Example;
// ...
Kaynak dosya C4471f.cpp
:
// C4471f.cpp
// Definition for scoped enumeration used in C4471e.cpp
// Compile with: cl /c /w14471 C4471e.cpp C4471f.cpp
enum class Example { item = 0 };
// ...