คำเตือน gcc "" จะเริ่มต้นหลังจาก '


228

ฉันได้รับคำเตือนมากมายจากรหัสบุคคลที่สามที่ฉันไม่สามารถแก้ไขได้ มีวิธีปิดการใช้งานคำเตือนนี้หรืออย่างน้อยก็ปิดการใช้งานในบางพื้นที่ (เช่น #pragma push / pop ใน VC ++)

ตัวอย่าง:

list.h:1122: warning: `list<LogOutput*, allocator<LogOutput*> >::node_alloc_' will be initialized after 
list.h:1117: warning:   `allocator<LogOutput*> list<LogOutput*, allocator<LogOutput*> >::alloc_'

คุณช่วยโพสต์ข้อความเตือนสองสามบรรทัดได้หรือไม่? และยังบอกด้วยว่านี่คือ C, C ++ และถ้าคุณมีแหล่งที่มาถ้าคำเตือนมาจากตัวเชื่อมโยงหรือกระบวนการรวบรวม?
csl

คำตอบ:


371

ตรวจสอบให้แน่ใจว่าสมาชิกปรากฏในรายการ initializer ตามลำดับเดียวกับที่ปรากฏในชั้นเรียน

Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

หรือคุณสามารถเปิด -Wno-reorder


91
ทำไม btw สำคัญนี้ เหตุใดจึงมีคำเตือนนี้
Eloff

40
@Eloff ในบางกรณี (ไม่แนะนำให้ใช้) bและการaเริ่มต้นอาจขึ้นอยู่กับกันและกัน ผู้ใช้ที่ไร้เดียงสาอาจพยายามปรับเปลี่ยนลำดับการเริ่มต้นเพื่อให้ได้ผลบางส่วนและคำเตือนจะทำให้ชัดเจนว่าไม่ได้ผล
Gorpik

24
คำสั่งของการประกาศมีความหมายเชิงความหมายแม้ว่าจะไม่มีความสัมพันธ์ระหว่างการประกาศหรือไม่? ช่างไร้จุดหมาย!
Cuadue

10
สิ่งนี้ไม่ได้อธิบายว่าทำไมคำเตือนนี้จึงมีอยู่และอ้างอิง-Wno-reorderโดยไม่กล่าวถึงปัญหาที่อาจนำไปสู่ ฉันรู้ว่า OP ไม่ได้ขอรายละเอียดอื่น ๆ แต่คำตอบที่ได้รับการโหวตอย่างสูงฉันคาดหวังว่าอย่างน้อยจะพูดถึงบริบทและคำเตือนรอบ ๆ นี้ เราไม่ควรตอบคำถามที่ OP ควรเขียนหรือไม่
underscore_d

4
@ cp.engr สมาชิกจะเริ่มต้นตามลำดับของการประกาศไม่ใช่ลำดับใน init-list - ดังนั้นหากการเริ่มต้นของสมาชิกขึ้นอยู่กับสมาชิกคนอื่น แต่การประกาศนั้นสลับกันดังนั้นการประกาศจึงขึ้นอยู่กับการได้รับการเริ่มต้นหลังจากขึ้นอยู่กับใครบางคน จะมีช่วงเวลาที่เลวร้ายในเร็ว ๆ นี้เนื่องจากเป็น UB ที่บริสุทธิ์
underscore_d


17

สำหรับผู้ที่ใช้ QT ที่มีข้อผิดพลาดนี้ให้เพิ่มไฟล์นี้ลงในไฟล์. pro

QMAKE_CXXFLAGS_WARN_ON += -Wno-reorder

7

ใช้-Wno-reorder(man gcc เป็นเพื่อนของคุณ :))


6
ว้าวคุณพบวิธีการใหม่ที่จะพูด RT_M: MIYF (ชายเป็นเพื่อนของคุณ) ถ้าคุณไม่ทราบผมจะใช้มัน :)
เร็น S

4

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

คุณสมบัติที่คล้ายกันอยู่ในเสียงดังกราว

หากคุณกำลังใช้ CMake คุณสามารถระบุสำหรับSYSTEMinclude_directories


คุณช่วยอธิบายวิธี "ระบุSYSTEM" ได้ไหม?
einpoklum

1
เพียงแค่ใส่สตริง 'SYSTEM' ที่ท้ายinclude_directoriesบรรทัด
Drew Noakes

1

ลำดับการเริ่มต้นไม่สำคัญ ฟิลด์ทั้งหมดจะเริ่มต้นได้ตามลำดับของคำนิยามในคลาส / โครงสร้างของพวกเขา แต่ถ้าลำดับในรายการเริ่มต้นนั้นแตกต่างกัน gcc / g ++ สร้างคำเตือนนี้ เปลี่ยนลำดับการเริ่มต้นเท่านั้นเพื่อหลีกเลี่ยงคำเตือนนี้ แต่คุณไม่สามารถกำหนดเขตข้อมูลที่ใช้ในการเริ่มต้นก่อนที่จะสร้าง มันจะเป็นข้อผิดพลาดรันไทม์ ดังนั้นคุณเปลี่ยนลำดับของคำจำกัดความ ระวังและให้ความสนใจ!


OP ต้องการทราบวิธีปิดใช้งานคำเตือนไม่ใช่ความหมายหรือวิธีแก้ไขรหัส ในความเป็นจริงโพสต์บอกว่ารหัสเป็นบุคคลที่สามและไม่สามารถแก้ไขได้ พวกเขาไม่สามารถเปลี่ยนลำดับของคำจำกัดความและอาจไม่ใช่ลำดับของการเริ่มต้นเช่นกัน
Tim Seguine

มันมากไม่ว่าถ้าวัตถุที่ 2 ในรายการ init จะ initd จากวัตถุที่ 1 แต่พวกเขากำลังประกาศทางที่ผิดไปรอบ ๆ ในส่วนหัว ในกรณีนั้นสิ่งต่าง ๆ อาจแปลกไปมาก
underscore_d

0
Class C {
   int a;
   int b;
   C():b(1),a(2){} //warning, should be C():a(2),b(1)
}

คำสั่งนั้นสำคัญเพราะถ้า a ถูกเตรียมใช้งานก่อน b และ a นั้นขึ้นอยู่กับ b พฤติกรรมที่ไม่ได้กำหนดจะปรากฏขึ้น

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