2013-05-14 21 views
5

C++'da minGW'de aşağıdaki uyarıyı nasıl devre dışı bırakabilirim? MinGW'de Eclipse'de Kullanılmayan Değişken uyarılarını nasıl devre dışı bırakırım?

warning: unused variable 'x' [-Wunused-variable] 

Eclipse CDT, ben uyarı numarasını bulamamanız:

../src/subfolder/ClassTwo.cpp:20:8: warning: unused variable 'x' [-Wunused-variable] 

bunu yaparken çalıştı:

#pragma warning(push) 
#pragma warning(disable: ?) //which number? 
#include "subfolder/ClassTwo.h" 
#pragma warning(pop) 

Ama işe yaramadı.

Sorularım:

  1. nasıl Eclipse CDT bu uyarı numarasını alabilirim?
  2. Pragma yönergesi nasıl yazılmalıdır?
+3

bir işlev parametresi ise, sadece isimsiz bırakın. GCC kullandığınızı varsayalım, daha çok #pragma gcc diagnostiği gibi bir şey ya da başka bir şeydir. – chris

+1

Sadece kodu düzeltin ve uyarı kendiliğinden geçecek ... - bu arada, başlıktaki uyarıları devre dışı bırakmanın, .cpp –

+0

adamlarında gerçekleşen uyarıyla yardımcı olacağını düşündüğünüz şey, Daha rahat konvansiyonlarla inşa edilmiş 3. parti başlık olabilir. değilse, o zaman - sadece düzeltin. – justin

cevap

3

Çıktıdan gelen çıktıya benziyor. Burada belirtilen yaklaşımı kullanarak aynı kullanarak clang elde edebilirsiniz: http://clang.llvm.org/docs/UsersManual.html#controlling-diagnostics-via-pragmas:

#pragma clang diagnostic push 
#pragma clang diagnostic ignored "-Wunused-variable" 
#include "subfolder/ClassTwo.h"  
#pragma clang diagnostic pop 

o zaman, sadece fix the warning kaynak dosyası buysa.

GCC için, bu kullanabilirsiniz: Elbette Selectively disable GCC warnings for only part of a translation unit?

#pragma GCC diagnostic push 
#pragma GCC diagnostic ignored "-Wunused-variable" 
#include "subfolder/ClassTwo.h" 
#pragma GCC diagnostic pop 

, pragma gürültü iyi bir miktar ile terk edeceğini - tartışılabilir bu kötü bir şey ise =)

+0

Sadece gcc değil clang – jiafu

+0

g ++ -I "C: \ c + \ gtest-1.6.0 \ gtest-1.6.0 \ include" -O0 -g3 -Wall -c -fmessage-length = 0 -MMD -MP - MF "src/Test.d" -MT "src/Test.d" -o "src/Test.o" "../src/Test.cpp" ../src/Test.cpp:1:0: uyarı: #pragma uyarıyı göz ardı etme [-Wunknown-pragmas] ../src/Test.cpp:2:0: uyarı: #pragma uyarılarını göz ardı etme [-Wunknown-pragmas] ../src/Test.cpp:3: 0: uyarı: #pragma uyarısını yok sayma [-Wunknown-pragmas] ../src/Test.cpp:5:0: uyarı: #pragma ihtarını ihmal [-Wunknown-pragmas] – jiafu

+0

@jiafu GCC yaklaşımı ve uyarısını düzeltmek için bir yol ekledi. – justin

3

Sen GCC derleyicisi ile Microsoft C++ tarzı pragma sözdizimi kullanıyor gibi görünüyor. "Uyarı numarası" (en azından bu formatta) kavramı da Microsoft C++ özeldir. Başka bir deyişle, bu GCC'de çalışmamalıdır.

Uyarıların devre dışı bırakılması/devre dışı bırakılması için standart bir sözdizimi yoktur, bu nedenle her derleyici kendi kullanır. Bu, "C++" da (başlığınızı alıntılayarak) yapmanın bir yolu olmadığı anlamına gelir. Her belirli derleyicide bunu yapmanın tek yolu vardır. Bunun için derleyici belgelerine başvurmalısınız.

GCC'de, tüm çeviri birimi için bu tür uyarıları devre dışı bırakmak için komut satırı seçenekleri -Wno-unused-variable aracılığıyla yapabilmeniz gerekir. Ayrıca, GCC'de, belirli bir değişkenin uyarılarını bastırmak için değişkenleri __attribute__((unused)) aracılığıyla kullanılmayan şekilde seçici olarak işaretleyebilirsiniz. o "Kullanılmayan değişken" uyarıları düzeltmek için NEREDEYSE her zaman kolay olduğu için

http://gcc.gnu.org/onlinedocs/gcc/Variable-Attributes.html#Variable-Attributes

6

, ben çok başka, gelecekteki hataları da gizleyebilir ki (pragmas ile Düzeltmek için daha gerçek kod düzeltmek için tercih ederim - örneğin yeni bir işlev eklemek:

int foo(int x, int y) 
{ 
     return x * x; 
} 

Maalesef bu bir yazım hatası, öyle return x * y; olması gerekiyor - bir uyarı bu durumda olduğunu fikir verirdi.o zaman sen (void)y (belki aa makro) kullanabilir, için "sahte kullanımı yerel değişken ise

int foo(int x, int) // Second parameter, y is not used 
{ 
     return x * x; 
} 

:

Kullanılmayan parametreler, birisi de belirtildiği gibi, parametrenin adını kaldırarak ele alınır o ":

int bar(int x) 
{ 
    int y; // Not used. 
    (void)y; 
} 

veya

#define NOT_USED(x) (void)(x) 

     int bar(int x) 
{ 
    int y; // Not used. 
    NOT_USED(y); 
} 
+0

teşekkürler, ama sadece pragma'nın özelliğini denemek istiyorum, doğru kodu kendim yazmamalı – jiafu

+0

Microsoft Nedir? 'UNREFERENCED_PARAMETER'? – chris

+0

Evet, durum böyle görünüyor. Ayrıca "UNUSED (x)" i bunun için bir makro olarak gördüm. –

İlgili konular