คุณจะปิดการใช้งานคำเตือนตัวแปรที่ไม่ได้ใช้งานที่ออกมาจาก gcc ในรหัสของบุคคลที่สามได้อย่างไร?


94

ฉันต้องการทราบว่าสวิตช์ใดที่คุณส่งต่อไปยังคอมไพเลอร์ gcc เพื่อปิดคำเตือนตัวแปรที่ไม่ได้ใช้ ฉันได้รับข้อผิดพลาดจากการเพิ่มประสิทธิภาพบน windows และฉันไม่ต้องการแตะรหัสเพิ่ม:

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]

ฉันลองใช้ทั้งสองอย่าง-Wunused-valueและ-Wno-unused-valueไม่ได้ระงับข้อความข้างต้น

คำสั่งที่ถูกต้องคืออะไรนี่คือบรรทัดคอมไพล์ของฉัน:

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

บางทีอาจจะ-Wallลบล้างเป้าหมายของฉัน?


ตามที่มีข้อความแสดงข้อผิดพลาดมากหรือน้อยลอง-Werror=no-unused-variable
Joachim Isaksson

คำตอบ:


242

-Wno-unused-variableสวิทช์มักจะไม่หลอกลวง อย่างไรก็ตามนั่นเป็นคำเตือนที่มีประโยชน์มากหากคุณสนใจสิ่งเหล่านี้ในโครงการของคุณ มันจะน่ารำคาญเมื่อ GCC เริ่มเตือนคุณเกี่ยวกับสิ่งที่ไม่อยู่ในโค้ดของคุณ

ฉันขอแนะนำให้คุณเปิดคำเตือนไว้ แต่ใช้-isystemแทน-Iการรวมไดเร็กทอรีของโครงการของบุคคลที่สาม ธงดังกล่าวจะบอก GCC ว่าอย่าเตือนคุณเกี่ยวกับสิ่งที่คุณไม่สามารถควบคุมได้

ตัวอย่างเช่นแทนที่จะพูด-IC:\\boost_1_52_0-isystem C:\\boost_1_52_0

หวังว่าจะช่วยได้ โชคดี!


จะเพิ่มการตั้งค่านี้ได้ที่ไหน ทำภายใต้ "การตั้งค่าโครงการ / AVR GNU C Compiler / เบ็ดเตล็ด" แต่จะถูกละเว้น (เส้นทางถูกต้องยังคงได้รับคำเตือน) เมื่อเพิ่มสิ่งนั้นในการตั้งค่าไดเรกทอรี (ยกเลิกการเลือกช่องทำเครื่องหมายเส้นทางสัมพัทธ์) AtmelStudio จะหยุดทำงาน
hfrmobile

3
นอกจากนี้เรายังมี-Wno-unused-parameterสำหรับพารามิเตอร์ฟังก์ชันที่ไม่ได้ใช้สำหรับฟังก์ชันที่ -Wno-unused-functionไม่ได้ใช้
Ngo Thanh Nhan

1
คุณต้องการ:-Wno-unused-but-set-variable -Wno-unused-parameter -Wno-unused-variable
Ronny Sherer

84

บางครั้งคุณเพียงแค่ระงับคำเตือนบางอย่างและต้องการเก็บคำเตือนอื่น ๆ ไว้เพื่อความปลอดภัย ในโค้ดของคุณคุณสามารถระงับคำเตือนสำหรับตัวแปรและแม้แต่พารามิเตอร์ที่เป็นทางการได้โดยใช้แอตทริบิวต์ที่ไม่ได้ใช้ของ GCC สมมติว่าคุณมีข้อมูลโค้ดนี้:

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

อาจมีสถานการณ์เมื่อคุณจำเป็นต้องใช้ฟังก์ชันนี้เป็นตัวจัดการซึ่ง (imho) พบได้บ่อยในไลบรารี C ++ Boost จากนั้นคุณต้องมีเวอร์ชันพารามิเตอร์ที่เป็นทางการที่สองดังนั้นลายเซ็นของฟังก์ชันจึงเหมือนกับเทมเพลตที่ตัวจัดการต้องการมิฉะนั้นการคอมไพล์จะล้มเหลว แต่คุณไม่จำเป็นต้องใช้มันในฟังก์ชั่นตัวเองเช่นกัน ...

วิธีการทำเครื่องหมายตัวแปรหรือพารามิเตอร์ทางการที่จะแยกออกจากคำเตือนคือ:

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

GCC มีพารามิเตอร์อื่น ๆ อีกมากมายที่คุณสามารถตรวจสอบพวกเขาในหน้าคน สิ่งนี้ใช้ได้กับโปรแกรม C ด้วยไม่เพียง แต่ C ++ เท่านั้นและฉันคิดว่ามันสามารถใช้ได้ในเกือบทุกฟังก์ชันไม่ใช่แค่ตัวจัดการ ลองดูสิ! ;)

PS: เมื่อเร็ว ๆ นี้ฉันใช้สิ่งนี้เพื่อระงับคำเตือนเกี่ยวกับการทำให้เป็นอนุกรมของ Boosts ในเทมเพลตเช่นนี้:

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

แก้ไข: เห็นได้ชัดว่าฉันไม่ได้ตอบคำถามของคุณตามที่คุณต้องการdrak0shaทำได้ดีกว่า เป็นเพราะฉันตามชื่อคำถามเป็นหลักความไม่ดีของฉัน หวังว่านี่อาจช่วยคนอื่น ๆ ที่มาที่นี่เพราะชื่อนั้น ... :)


7
void func(unsigned number, const int)สำหรับพารามิเตอร์อย่างเป็นทางการคุณสามารถละเว้นชื่อเช่น จากนั้น GCC versionยังจะไม่บ่นเกี่ยวกับการที่ไม่ได้ใช้
Olaf Dietsche

@OlafDietsche ฉันคิดว่ามันขึ้นอยู่กับgccรุ่นที่คุณใช้ IIRC ผมต้องใช้มันเหล่านั้น 4 versionปีที่ผ่านมาคำเตือนเกี่ยวกับการปราบปรามที่ไม่ได้ใช้ ;)
Dee'Kej

67

หากคุณใช้ gcc และต้องการปิดคำเตือนสำหรับโค้ดที่เลือกคุณสามารถใช้ #pragma คอมไพเลอร์คำสั่ง:

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

สำหรับโค้ดที่คุณควบคุมคุณอาจใช้__attribute__((unused))เพื่อสั่งคอมไพเลอร์ว่าห้ามใช้ตัวแปรเฉพาะ



โดยทั่วไปฉันจะบอกว่าการใช้คำสั่ง #pragma นั้นไม่ปลอดภัยนักเว้นแต่คุณจะรู้จริงๆว่าคุณกำลังทำอะไรอยู่หรือคุณกำลังใช้เช่น OpenMP สำหรับการขนาน ... ;)
Dee'Kej

1
#pragmaคำสั่งของ@ Dee'Kej นั้นปลอดภัยอย่างยิ่งหากคุณรวมเข้า#ifdef some_compiler ... #endifไว้ คำเตือนเป็นคุณลักษณะเฉพาะของคอมไพเลอร์และไม่ได้กำหนดโดยมาตรฐาน คุณไม่สามารถระงับคำเตือนใด ๆ จากรหัสโดยไม่มี#pragmas
Kotauskas

@ vladislav-toncharov คุณพูดถูกเกี่ยวกับคำเตือนที่เป็นคอมไพเลอร์เฉพาะ แต่เราไม่ได้พูดถึงคำเตือนของคอมไพเลอร์โดยทั่วไปที่นี่เรากำลังพูดถึง GCC โดยเฉพาะ คุณพูดถูกเช่นกันที่ #pragma ไม่เป็นอันตรายต่อการพูด อย่างไรก็ตาม IMO หลายคนไม่รู้วิธีใช้ #pragma อย่างถูกต้องและนั่นคือเหตุผลที่ฉันคิดว่ามัน "อันตราย" (เพราะไม่มีคำที่ดีกว่า)
Dee'Kej

15

ดูman gccภายใต้ตัวเลือกคำเตือน ที่นั่นคุณมีไฟล์unused

คำเตือนตัวเลือก
... -Wunused -Wunused-function -Wunused-label -Wunused-parameter -Wunused-value -Wunused-variable -Wunused-but-set-parameter -Wunused-but-set-variable

หากคุณนำหน้าด้วยno-คำเตือนจะปิดใช้งานคำเตือนนี้

ตัวเลือกจำนวนมากมีชื่อยาวขึ้นต้นด้วย -f หรือด้วย -W --- ตัวอย่างเช่น -fmove-loop-invariants -Wformat และอื่น ๆ ส่วนใหญ่มีทั้งรูปแบบเชิงบวกและเชิงลบ รูปแบบเชิงลบของ -ffoo จะเป็น -fno-foo คู่มือนี้จัดทำเอกสารเพียงรูปแบบเดียวในสองรูปแบบนี้แล้วแต่ว่าแบบใดจะไม่ใช่ค่าเริ่มต้น

สามารถดูคำอธิบายโดยละเอียดเพิ่มเติมได้ที่ตัวเลือกในการร้องขอหรือระงับคำเตือน


ไม่ทราบว่าฉันสามารถนำหน้า "no-" พร้อมคำเตือนใด ๆ
RNA

10

การใช้-Wno-unused-variableงานควรใช้งานได้


อ่าตัวแปรที่ไม่ได้ใช้ไม่ใช่ค่าที่ไม่ได้ใช้!
WilliamKF

5
หรือ-Wno-error=unused-variableหากคุณต้องการลบข้อผิดพลาดและเก็บคำเตือนไว้
Oskar N.

1
คุณสามารถดูคำเตือนที่แท้จริง[-Werror=unused-variable]ได้
Mats Petersson

3

คอมไพเลอร์บอกคุณอยู่แล้วไม่ใช่valueแต่variable. -Wno-unused-variableคุณกำลังมองหา ลองg++ --help=warningsดูรายการตัวเลือกที่มี


3

คุณจะปิดการใช้งานคำเตือนตัวแปรที่ไม่ได้ใช้งานที่ออกมาจาก gcc ได้อย่างไร
ฉันได้รับข้อผิดพลาดจากการเพิ่มประสิทธิภาพบน windows และฉันไม่ต้องการแตะรหัสเพิ่ม ...

คุณเยี่ยมชมTrac ของ Boostและยื่นรายงานข้อผิดพลาดกับ Boost

แอปพลิเคชันของคุณไม่รับผิดชอบในการล้างคำเตือนและข้อผิดพลาดของห้องสมุด ห้องสมุดมีหน้าที่ล้างคำเตือนและข้อผิดพลาดของตนเอง


0

-Wallและ-Wextraกำหนดขั้นตอนใน GCC และขั้นตอนต่อไป-Wno-unused-variableอาจไม่มีผล ตัวอย่างเช่นหากคุณมี:

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 เห็นคำสั่ง-Wall -Wextraและดูเหมือนจะเพิกเฉย-Wno-unused-variable

ซึ่งอาจมีลักษณะเช่นนี้แทนด้านล่างและคุณจะได้รับเอฟเฟกต์ที่ต้องการจากการไม่หยุดในการคอมไพล์ของคุณบนตัวแปรที่ไม่ได้ใช้:

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

มีเหตุผลที่ดีที่เรียกว่า "คำเตือน" กับ "ข้อผิดพลาด" การคอมไพล์ล้มเหลวเพียงเพราะโค้ดของคุณยังไม่สมบูรณ์ (บอกว่าคุณกำลังทำให้อัลกอริทึมไม่สมบูรณ์) สามารถเอาชนะได้


โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.