Düzenlemek istemediğim 3. parti kodda gcc'den çıkan kullanılmayan değişken uyarılarını nasıl devre dışı bırakabilirsiniz?


97

Kullanılmayan değişken uyarılarını kapatmak için gcc derleyicisine hangi anahtarı verdiğinizi bilmek istiyorum. Windows'ta desteklemeden hatalar alıyorum ve yükseltme koduna dokunmak istemiyorum:

C:\boost_1_52_0/boost/system/error_code.hpp: At global scope:
C:\boost_1_52_0/boost/system/error_code.hpp:214:36: error: 'boost::system::posix_category' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:215:36: error: 'boost::system::errno_ecat' defined but not used [-Werror=unused-variable]
C:\boost_1_52_0/boost/system/error_code.hpp:216:36: error: 'boost::system::native_ecat' defined but not used [-Werror=unused-variable]

Ben ikisini de kullanarak çalıştı -Wunused-valueve -Wno-unused-valueancak hiçbiri yukarıdaki mesajlar bastırılmış.

Doğru komut nedir, işte derleme satırım:

g++  -g -fno-inline -Wall -Werror -Wextra -Wfloat-equal -Wshadow
-Wpointer-arith -Wcast-qual -Wcast-align -Wwrite-strings -Wno-conversion 
-Wdisabled-optimization -Wredundant-decls -Wunused-value -Wno-deprecated 
-IC:\\boost_1_52_0 -D_LARGEFILE_SOURCE -D_LARGEFILE64_SOURCE -D_FILE_OFFSET_BITS=64 
-c -o op.o op.cpp

Belki de -Wallhedefimi geçersiz kılar?


Hata mesajının aşağı yukarı söylediği gibi, deneyin-Werror=no-unused-variable
Joachim Isaksson

Yanıtlar:


244

-Wno-unused-variableAnahtar genellikle işe yaramaktadır. Ancak, projenizde bunları önemsiyorsanız, bu gerçekten çok faydalı bir uyarıdır. GCC sizi kodunuzda olmayan şeyler hakkında uyarmaya başladığında sinir bozucu hale gelir.

Uyarıyı açık tutmanızı tavsiye ederim, ancak üçüncü taraf projelerin dizinlerini dahil etmek -isystemyerine kullanın -I. Bu bayrak GCC'ye, üzerinde kontrolünüz olmayan şeyler hakkında sizi uyarmamasını söyler.

Örneğin, yerine -IC:\\boost_1_52_0diyelim -isystem C:\\boost_1_52_0.

Umarım yardımcı olur. İyi şanslar!


Bu ayar nereye eklenir? "Project Settings / AVR GNU C Compiler / Miscellaneous" altında yaptım ama yok sayılacak (yol doğru, yine de uyarılar alıyor) Bunu Dizin ayarlarına eklerken (göreli yol onay kutusunun işaretini kaldırın) AtmelStudio çökecek.
hfrmobile

3
biz de var -Wno-unused-parameter, kullanılmayan işlev parametreleri için -Wno-unused-functionkullanılmayan bir işlev için
Ngo Thanh Nhan

1
İhtiyacın olan:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

84

Bazen yalnızca bazı uyarıları bastırmanız gerekir ve yalnızca güvende olmak için diğer uyarıları saklamak istersiniz. Kodunuzda, GCC'nin kullanılmayan özniteliğini kullanarak değişkenler ve hatta biçimsel parametreler için uyarıları bastırabilirsiniz . Bu kod parçacığına sahip olduğunuzu varsayalım:

void func(unsigned number, const int version)
{
  unsigned tmp;
  std::cout << number << std::endl;
}

Bu işlevi bir işleyici olarak kullanmanız gerektiğinde bir durum olabilir - ki bu (imho) C ++ Boost kitaplığında oldukça yaygındır. Ardından ikinci biçimsel parametre sürümüne ihtiyacınız vardır , böylece işlevin imzası işleyicinin gerektirdiği şablonla aynı olur, aksi takdirde derleme başarısız olur. Ama fonksiyonun kendisinde de buna gerçekten ihtiyacınız yok ...

Uyarılardan hariç tutulacak değişken veya resmi parametrenin nasıl işaretleneceğinin çözümü şudur:

void func(unsigned number, const int version __attribute__((unused)))
{
  unsigned tmp __attribute__((unused));
  std::cout << number << std::endl;
}

GCC'nin birçok başka parametresi vardır, bunları man sayfalarında kontrol edebilirsiniz . Bu sadece C ++ için değil, C programları için de işe yarıyor ve bence sadece işleyicilerde değil hemen hemen her işlevde kullanılabiliyor. Git ve dene! ;)

Not: Son zamanlarda bunu, Boosts'un şablondaki serileştirme uyarılarını şu şekilde bastırmak için kullandım:

template <typename Archive>
void serialize(Archive &ar, const unsigned int version __attribute__((unused)))

DÜZENLEME: Görünüşe göre sorunuzu gerektiği gibi cevaplamadım, drak0sha daha iyi yaptı. Çünkü sorunun başlığını çoğunlukla takip ettim, benim hatam. Umarım bu, o başlık nedeniyle buraya gelen diğer insanlara yardımcı olabilir ... :)


7
Biçimsel parametreler için adı atlayabilirsiniz, örneğin void func(unsigned number, const int). O zaman gcc de kullanılmadığından şikayet etmez version.
Olaf Dietsche

@OlafDietsche Bunun gcckullandığınız versiyona bağlı olduğunu düşünüyorum . IIRC, kullanılmayanlarla ilgili uyarıları bastırmak için 4 yıl önce kullanmak zorunda kaldım version. ;)
Dee'Kej

69

Gcc kullanıyorsanız ve seçilen kod için uyarıyı devre dışı bırakmak istiyorsanız, #pragma derleyici yönergesini kullanabilirsiniz:

#pragma GCC diagnostic push
#pragma GCC diagnostic ignored "-Wunused-variable"
( your problematic library includes )
#pragma GCC diagnostic pop

Kontrol ettiğiniz kod __attribute__((unused))için, derleyiciye belirli değişkenlerin kullanılmadığını bildirmek için de kullanabilirsiniz .



Genel olarak, ne yaptığınızı gerçekten bilmiyorsanız veya örneğin paralelleştirme için OpenMP kullanmıyorsanız, #pragma direktiflerini kullanmanın pek güvenli olmadığını söyleyebilirim ...;)
Dee'Kej

1
@ Dee'Kej #pragmayönergeleri, bunları içine alırsanız tamamen güvenlidir #ifdef some_compiler ... #endif. Uyarılar derleyiciye özgü bir özelliktir ve standart tarafından tanımlanmamıştır. #pragmaS olmadan koddan gelen uyarıları engelleyemezsiniz .
Kotauskas

@ vladislav-toncharov Uyarıların derleyiciye özel olduğu konusunda haklısın. Ancak burada genel olarak derleyici uyarılarından bahsetmiyoruz - özellikle GCC'den bahsediyoruz. Ayrıca #pragma'nın söz başına zararlı olmadığı konusunda da haklısınız. Bununla birlikte, IMO birçok kişi # pragmanın doğru şekilde nasıl kullanılacağını bilmiyor ve bu yüzden ben bunu "tehlikeli" olarak görüyorum (daha iyi kelimelerin olmaması nedeniyle).
Dee'Kej

15

man gccUyarı Seçenekleri bölümüne bakın . Orada bir sürü varunused

Uyarı Seçenekleri
... -Wunused -Wunused-function -Wunused-label -Wunused-parametre -Wunused-value -Wunused-değişken -Wunused-but-set-parametre -Wunused-but-set-değişken

Herhangi birinin önüne koyarsanız no-, bu uyarıyı devre dışı bırakır.

Birçok seçeneğin -f veya -W --- ile başlayan uzun adları vardır, örneğin, -fmove-döngü-değişmezleri, -Wformat vb. Bunların çoğunun hem olumlu hem de olumsuz biçimleri vardır; -ffoo'nun negatif biçimi -fno-foo olacaktır. Bu kılavuz, hangisi varsayılan değilse, bu iki formdan yalnızca birini belgeler.

Daha ayrıntılı açıklama Uyarıları İsteme veya Bastırma Seçeneklerinde bulunabilir.


Herhangi bir uyarı ile "hayır" ın önüne ekleyebileceğimi bilmiyordum.
RNA

11

Kullanım -Wno-unused-variableişe yaramalı.


Ahh, kullanılmayan değişken, kullanılmayan değer değil!
WilliamKF

6
Veya -Wno-error=unused-variablehatayı gidermek ve uyarıyı saklamak istiyorsanız.
Oskar N.

1
Aslında asıl uyarının ne olduğunu görebilirsiniz [-Werror=unused-variable].
Mats Petersson

3

Derleyici zaten size söylüyor, valueama değil variable. Sen arıyorsun -Wno-unused-variable. Ayrıca, g++ --help=warningsmevcut seçeneklerin bir listesini görmeye çalışın .


3

Gcc'den çıkan kullanılmayan değişken uyarılarını nasıl devre dışı bırakırsınız?
Pencerelerde desteklemeden hatalar alıyorum ve yükseltme koduna dokunmak istemiyorum ...

Boost'un İzini ziyaret edersiniz karşı bir hata raporu sunarsınız.

Uygulamanız, kitaplık uyarılarının ve hatalarının temizlenmesinden sorumlu değildir. Kütüphane, kendi uyarılarını ve hatalarını temizlemekle sorumludur.


0

-Wallve -WextraGCC'deki aşamayı ayarlar ve sonraki -Wno-unused-variableişlem geçerli olmayabilir. Örneğin, varsa:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -Wall -Wextra \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ -Wno-unused-parameter \ -Wno-unused-variable \ $(INC)

GCC talimatı görür -Wall -Wextrave görmezden gelir-Wno-unused-variable

Bu, bunun yerine aşağıdaki gibi görünebilir ve kullanılmayan değişken üzerinde derlemenizde durdurulmamak gibi istenen etkiyi elde edebilirsiniz:

CFLAGS += -std=c99 -pedantic -pedantic-errors -Werror -g0 -Os \ -fno-strict-overflow -fno-strict-aliasing \ -pthread \ -Wno-unused-label \ -Wno-unused-function \ $(INC)

Bunun "uyarı" yerine "hata" olarak adlandırılmasının iyi bir nedeni vardır. Sadece kodunuz tamamlanmadığı için derlemede başarısız olmak (diyelim ki algoritmayı dışarıda bırakıyorsunuz) yenebilir.


-3
export IGNORE_WARNINGS=1

Uyarıları gösterir, ancak yapıyla devam eder

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.