เหตุใด GCC จึงเตือนฉันเกี่ยวกับการล้มเหลวแม้ว่าฉันจะใช้ [[fallthrough]]


86

ในส่วนของโค้ดต่อไปนี้ฉันใช้[[fallthrough]]แอตทริบิวต์มาตรฐานจาก C ++ 1z เพื่อจัดทำเอกสารว่าต้องการการล่มสลาย:

#include <iostream>

int main() {
    switch (0) {
        case 0:
            std::cout << "a\n";
            [[fallthrough]]
        case 1:
            std::cout << "b\n";
            break;
    }
}

ด้วย GCC 7.1 โค้ดจะคอมไพล์โดยไม่มีข้อผิดพลาด อย่างไรก็ตามคอมไพเลอร์ยังคงเตือนฉันเกี่ยวกับการล่มสลาย:

warning: this statement may fall through [-Wimplicit-fallthrough=]
    std::cout << "a\n";
    ~~~~~~~~~~^~~~~~~~

ทำไม?


33
และที่นี่ฉันคิดว่าคุณคน C ++ ไม่สามารถทำสิ่งที่น่าเกลียดได้!
SnakeDoc

3
@SnakeDoc: เป็นของขวัญ!
Deduplicator

3
@SnakeDoc นั่นควรจะเป็นความคิดเห็นเกี่ยวกับคำตอบซึ่งทำให้แย่ลงไปอีก :)

23
ฉันไม่เห็นด้วยกับการโหวตที่ใกล้ชิด เหตุผล "ข้อผิดพลาดในการพิมพ์อย่างง่าย" มีอยู่สำหรับกรณีที่ปัญหาของ OP เกิดขึ้นเพียงเพราะความผิดพลาดบางอย่างที่ไม่เกี่ยวข้องกับคำอธิบายคำถามและจะไม่มีประโยชน์สำหรับคนอื่น ในกรณีนี้มีโอกาสมากที่คนอื่นจะลืมอัฒภาคในตำแหน่งนั้นรับข้อผิดพลาดเดียวกันและพบคำถามนี้เมื่อต้องการวิธีแก้ไข
CodesInChaos

14
ฉันไม่ชอบอย่างยิ่งที่ความคิดเห็นของฉันถูกลบออกจากคำถามนี้ดังนั้นฉันจึงถูกบังคับให้ทำซ้ำอีกครั้งแม้ว่านี่จะเป็นข้อผิดพลาดในการพิมพ์ แต่ก็มีโอกาสมากที่ผู้ใช้รายอื่นจะทำซ้ำค้นหาและค้นหาคำถามนี้พร้อมกับคำตอบนี้ ดังนั้นจึงเป็นทั้งคำถามที่ดีและคำตอบที่ดีและสมควรเปิดทิ้งไว้
Barry

คำตอบ:


105

คุณไม่มีเครื่องหมายอัฒภาคหลังแอตทริบิวต์:

case 0:
    std::cout << "a\n";
    [[fallthrough]];
    //             ^
case 1:

[[fallthrough]]แอตทริบิวต์ที่จะถูกนำไปใช้กับคำว่าง (ดูP0188R1 ) ลำตัวเสียงดังในปัจจุบันให้ข้อผิดพลาดที่เป็นประโยชน์ในกรณีนี้ :

error: fallthrough attribute is only allowed on empty statements
    [[fallthrough]]
      ^
note: did you forget ';'?
    [[fallthrough]]
                   ^
                   ;

อัปเดต: Cody Gray รายงานปัญหานี้ต่อทีม GCC


การพูดถึงสิ่งที่ใช้กับแอตทริบิวต์โดยไม่มีเครื่องหมายอัฒภาคจะดี ฉันคิดว่ามันเป็นกรณีต่อไป?
CodesInChaos

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; เนื่องจากไม่ได้ตามด้วยคำสั่งที่ว่างเปล่า gcc ก็เพิกเฉย
musicman523

2
@ musicman523 นั่น ... ดูเหมือนว่า ... ผิด? ดูเหมือนว่าจะมีเหตุผลมากกว่าที่จะต้องใช้อัฒภาคแม้ว่าจะตามด้วยคำสั่งว่างเปล่าและเพียงแค่ปฏิเสธที่จะรวบรวมเป็นอย่างอื่น
SnakeDoc

@SnakeDoc เห็นได้ชัดว่าเป็นเพียงกรณีเฉพาะของแอตทริบิวต์คำสั่งดังนั้น parser จึงอนุญาตให้ใช้ผ่าน แต่ไม่มีความหมายใด ๆ เมื่อนำไปใช้กับคำสั่งที่ไม่ว่างเปล่า พิจารณาว่าเป็นจุดบกพร่องหากคุณต้องการและclangแก้ไข
Barmar

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