Tek uyarı hatasını devre dışı bırakın


115

Visual Studio ile bir cpp dosyasında sadece tek bir uyarı satırını devre dışı bırakmanın bir yolu var mı?

Örneğin, bir istisna yakalayıp işleme koymazsam 4101 hatası alıyorum (başvurulmayan yerel değişken). Bunu sadece bu işlevde görmezden gelmenin, aksi takdirde derleme biriminde bildirmenin bir yolu var mı? Şu anda, #pragma warning (disable : 4101)dosyanın en üstüne koyuyorum , ama bu açıkça onu tüm birim için kapatıyor.


19
sadece türden bahsedip istisnayı isimlendirmezseniz, herhangi bir uyarı olmayacaktır. Örn catch (const std::exception& /* unnamed */) {.... }. Sorunuza cevap vermiyor ama probleminizi çözebilir.
Sjoerd

Yanıtlar:


182
#pragma warning( push )
#pragma warning( disable : 4101)
// Your function
#pragma warning( pop ) 

1
@Cookie: evet, derleyiciden geçen herhangi bir kod parçası için işe yarar.
Matteo Italia

Daha yeni, kısa bir cevap için aşağıdaki Daniel Seither'ın cevabına bakın.
Dan Nissenbaum

4
clangBu pragma desteklemek için görünmüyor, ancak aynı etkiyi elde edebilirsiniz #pragma clang diagnostic push, #pragma clang diagnostic ignored "-Wunused-variable"ve #pragma clang diagnostic pop. Clang Kullanım Kılavuzu'nda "Pragmas Yoluyla Tanılamayı Kontrol Etme"
rampion

Bu özelliği nadiren kullandığım için, bunu yaptığımda, sözdizimini kendime hatırlatmak için genellikle bu sayfaya dönerim. Bunu, asla güncellenemeyecek, kullanımdan kaldırılmış bir işleve yapılan bir çağrıya koydum, böylece dini olarak taradığım derleyici listelerinde uyarı beni rahatsız etmeyecek.
David A. Gray

Visual Studio için komut satırı bağımsız değişkeni /wd4101. :Bayrak ve sayı arasında normal bir durum olmadığını ve virgülle ayrılmış bir sayı listesi yapamayacağınızı unutmayın. Diğer derleyiciler için bunun yerine olabilir/nowarn:4101 .
Jesse Chisholm

90

Yalnızca tek bir kod satırındaki bir uyarıyı gizlemek istiyorsanız, suppress uyarı belirticisini kullanabilirsiniz :

#pragma warning(suppress: 4101)
// here goes your single line of code where the warning occurs

Tek bir kod satırı için bu, aşağıdakileri yazmakla aynı şekilde çalışır:

#pragma warning(push)
#pragma warning(disable: 4101)
// here goes your code where the warning occurs
#pragma warning(pop)

8
Çok kullanışlı! Ne yazık ki, uyarıyı oluşturan bir başlık içeren tek bir satır için çalışmaz.
Marko Popovic

2
@MarkoPopovic: Tanımlayıcı suppress, önceden işlenmiş tek bir kod satırında çalışır . Aşağıdaki satır #pragma warning(suppress: ...)bir #includeyönergeyse (parametresiyle başvurulan dosyayı geçerli derleme birimine genişletir), etki yalnızca o dosyanın ilk satırına uygulanır. Uyarılar derleyici tarafından oluşturulduğundan, bu açık olmalıdır. Derleyici, önceden işlenmiş kod üzerinde çalışır.
2016

@IInspectable Bu durumda ben buna sonradan işlenmiş bir kod satırı derdim . önceden işlenmiş , önişlemci tarafından henüz çevrilmediği anlamına gelir.
void.pointer

2
@voi: "-ed" son, geçmiş katılımcıyı ifade eder . Geçmişte bir şeyin bittiğini ifade etmek için kullanılır. Bir "ön-işlem" hattı işlendikten bir çizgidir.
2019

29

#pragma push / pop genellikle bu tür problemler için bir çözümdür, ancak bu durumda neden referans verilmeyen değişkeni kaldırmıyorsunuz?

try
{
    // ...
}
catch(const your_exception_type &) // type specified but no variable declared
{
    // ...
}

6
Bu sorunun cevabı değil. Kabul edilirse, bu OP'nin problemini çözebilir, ancak gelecekteki okuyuculara benzer bir soruyla yardımcı olmaz: "Kodumun belirli bir bölümü için belirli bir uyarıyı nasıl kapatırım?"
Sjoerd

1
@Sjoerd: Üç kişi, diğerlerinin arayabileceği "resmi soruyu" yanıtladı, bu yüzden satır aralarını okumaya ve gerçek problemini çözmeye çalıştım (yorumunuzdan bir dakika sonra vararak :P).
Matteo Italia

11
@Sjoerd, gelecekteki bir okuyucu olarak bu cevabın aslında bana yardımcı olduğunu onaylıyorum.
Mołot

2
@ Mołot: Eski bir yazar olarak yardımcı olmasına sevindim. =)
Matteo Italia

9

Kullanın #pragma warning ( push ), ardından #pragma warning ( disable )kodunuzu girin ve burada#pragma warning ( pop ) açıklandığı gibi kullanın :

#pragma warning( push )
#pragma warning( disable : WarningCode)
// code with warning
#pragma warning( pop ) 

8

Misal:

#pragma warning(suppress:0000)  // (suppress one error in the next line)

Bu pragma, Visual Studio 2005'ten itibaren C ++ için geçerlidir .
Https://msdn.microsoft.com/en-us/library/2c8f766e(v=vs.80).aspx

Pragma, Visual Studio 2005 ile Visual Studio 2015 arasındaki C # için geçerli DEĞİLDİR .
Hata: "Devre dışı bırakma veya geri yükleme bekleniyor".
(Sanırım uygulamaya hiç gelmediler suppress...)
https://msdn.microsoft.com/en-us/library/441722ys(v=vs.140).aspx

C # farklı bir biçime ihtiyaç duyar. Şöyle görünür (ama işe yaramaz):

#pragma warning suppress 0642  // (suppress one error in the next line)

Bunun yerine suppress, yapmanız disableve enable:

if (condition)
#pragma warning disable 0642
    ;  // Empty statement HERE provokes Warning: "Possible mistaken empty statement" (CS0642)
#pragma warning restore 0642
else

Bu çok çirkin, bence onu yeniden biçimlendirmenin daha akıllıca olduğunu düşünüyorum:

if (condition)
{
    // Do nothing (because blah blah blah).
}
else

5

Bunun yerine dosyanın üst (veya hatta bir başlık dosyası) üzerine koyma, sadece birlikte söz konusu kod kaydırmak #pragma warning (push), #pragma warning (disable)ve bir eşleme #pragma warning (pop)gösterildiği gibi, burada .

Her ne kadar dahil olmak üzere başka seçenekler olsa da #pramga warning (once).


5

Bir de UNREFERENCED_PARAMETERtanımlanmış kullanılabilir WinNT.H. Tanım sadece:

#define UNREFERENCED_PARAMETER(P)          (P)

Ve şu şekilde kullanın:

void OnMessage(WPARAM wParam, LPARAM lParam)
{
    UNREFERENCED_PARAMETER(wParam);
    UNREFERENCED_PARAMETER(lParam);
}

Neden onu kullanasınız, değişken adının kendisini çıkarabileceğinizi iddia edebilirsiniz. Değişkenin gerçekten kullanılabileceği durumlar (farklı proje konfigürasyonu, Hata Ayıklama / Yayın yapıları) vardır. Değişken kullanılmayan başka bir konfigürasyonda (ve dolayısıyla uyarı).

Bazı statik kod analizleri, bu anlamsız ifade ( wParam;) için yine de uyarı verebilir . Bu durumda, DBG_UNREFERENCED_PARAMETERhangisini UNREFERENCED_PARAMETERhata ayıklama yapılarında olduğu gibi kullanabilirsiniz ve P=Pyayın yapısında kullanabilirsiniz.

#define DBG_UNREFERENCED_PARAMETER(P)      (P) = (P)

1
C ++ 11'den bu yana[[maybe_unused]]
metablaster

2

unreferenced local variableBazı başlıklarda yazmayı devre dışı bırakmak istiyorsanız

template<class T>
void ignore (const T & ) {}

ve kullan

catch(const Except & excpt) {
    ignore(excpt); // No warning
    // ...  
} 

2
Sadece uyarıyı bastırmak için bir işlev çağrısı mı? Yerine neden bunu yapmayın: (void)unusedVar;?
Nawaz

@Nawaz: (void)unusedVar;?C ++ Standardına uygun olmadığını düşünüyorum .
Alexey Malistov

2
Değeri hiçbir şey olmayan bir ifade. C ++ 'da bile yapabilirsiniz static_cast<void>(unusedVar).
Nawaz


2
§5.2.9 / 4 Any expression can be explicitly converted to type “cv void.” The expression value is discarded, yazabileceğinizi static_cast<void>(unusedVar)ve static_cast<const void>(unusedVar)ve yazabileceğinizi söylüyor static_cast<volatile void>(unusedVar). Tüm formlar geçerlidir. Umarım şüphenizi açıklığa kavuşturur.
Nawaz

2

Bazı durumlarda , adlandırılmış bir parametreniz olması gerekir , ancak onu doğrudan kullanmazsınız.
Örneğin, VS2010'da karşılaştım, 'e' yalnızca bir decltypeifadede kullanıldığında , derleyici şikayet ediyor ancak adlandırılmış değişkene sahip olmalısınıze .

Yukarıdaki #pragmatüm öneri olmayanların tümü, yalnızca tek bir ifade eklemeye indirgenir:

bool f(int e)
{ 
   // code not using e
   return true;
   e; // use without doing anything
}

1
şimdi (MS VS2015 derleyicisinde) bu C4702'ye erişilemez koda neden oluyor
Cee McSharpface,

2

@rampion'dan bahsedildiği gibi, clang gcc içindeyseniz, uyarılar numaraya göre değil ada göredir ve yapmanız gerekir:

#pragma clang diagnostic push
#pragma clang diagnostic ignored "-Wunused-variable"
// ..your code..
#pragma clang diagnostic pop

bu bilgi buradan geliyor

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.