[[Fallthrough]] kullandığım halde GCC neden beni bir düşüş hakkında uyarıyor?


86

Aşağıdaki kod parçasında, [[fallthrough]]bir düşüşün istendiğini belgelemek için C ++ 1z'den standart niteliği kullanıyorum :

#include <iostream>

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

GCC 7.1 ile kod hatasız derlenir. Bununla birlikte, derleyici hala bir sonuç hakkında beni uyarıyor:

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

Neden?


33
Ve ben de siz C ++ halkının işleri daha da çirkinleştiremeyeceğini düşünüyordum!
SnakeDoc

3
@SnakeDoc: Bu bir hediye!
Deduplicator

3
@SnakeDoc Bu, cevabı daha da kötüleştiren bir yorum olmalı. :)

23
Yakın oylara katılmıyorum. "Basit bir yazım hatası" nedeni, OP'nin sorununun yalnızca soru açıklamasıyla ilgisi olmayan bazı hatalar nedeniyle meydana geldiği ve başka hiç kimse için yararlı olmayacağı durumlarda mevcuttur. Bu durumda, diğer insanların o yerdeki noktalı virgülü unutması, aynı hatayı alması ve bir çözüm ararken bu soruyu bulması oldukça muhtemeldir.
CodesInChaos

14
Yorumumun bu sorudan çıkarılmasını kesinlikle sevmiyorum, bu yüzden tekrar tekrarlamak zorunda kalıyorum - bu gerçekten bir yazım hatası olsa da, diğer kullanıcıların bunu tekrar etmesi, arayması ve bu soruyu bu cevapla bulması çok muhtemeldir. Bu nedenle hem iyi bir soru hem de iyi bir cevaptır ve açık bırakılmayı hak eder.
Barry

Yanıtlar:


105

Öznitelikten sonra bir noktalı virgül eksik:

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

[[fallthrough]]Nitelik boş açıklamaya (bkz uygulanacak olan P0188R1 ). Mevcut Clang bagajı bu durumda faydalı bir hata verir :

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

Güncelleme: Cody Gray bu sorunu GCC ekibine bildirdi .


Noktalı virgül olmadan özniteliğin ne için geçerli olduğunu belirtmek güzel olurdu. Sanırım bir sonraki dava için?
CodesInChaos

2
@CodesInChaos fallthrough attribute is only allowed on empty statements; boş bir ifade gelmediği için, gcc bunu görmezden geliyor
musicman523

2
@ musicman523 Bu ... görünüyor ... yanlış? Görünüşe göre, boş bir ifade gelse bile noktalı virgül gerektirip başka türlü derlemeyi reddetmek daha mantıklı olacaktır.
SnakeDoc

@SnakeDoc Görünüşe göre bu sadece belirli bir ifade öznitelikleri durumudur, bu nedenle ayrıştırıcı buna izin verir, ancak boş olmayan bir ifadeye uygulandığında herhangi bir semantiği yoktur. İsterseniz bir hata olarak düşünün ve clangdüzeltin.
Barmar

2
@CodesInChaos Noktalı virgül olmadan, öznitelik etikete uygun olacaktır.
TC
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.