top of page

C++ Dilinde [[nodiscard]] attribute

  • Writer: Yusuf Hançar
    Yusuf Hançar
  • Feb 21
  • 2 min read

C++’ta [[attribute]] (öznitelik) mekanizması, kod hakkında ek bilgi sağlayarak derleyicinin uyarılar vermesine, belirli optimizasyonlar yapmasına veya kodu daha okunabilir hale getirmesine yardımcı olur.


Özniteliklerin Faydaları:

Koruma Mekanizması:

  • Derleyicinin belirli durumlar için uyarı vermesini sağlayabilir.

    Kod Okunurluğu:

  • Kodun amacını daha net hale getirerek geliştiricilere rehberlik eder.

    Performans Optimizasyonu:

  • [[likely]], [[unlikely]] gibi öznitelikler, derleyicinin dallanma tahminini optimize etmesine yardımcı olabilir.


Kullanımı
  • Öznitelikler her zaman [[ ... ]] şeklinde yazılır.


[[nodiscard]]
  • https://en.cppreference.com/w/cpp/language/attributes/nodiscard

  • logic bir öğenin discard edilmesinin logic bir hata olduğunu ifade eder.

  • c++11

  • nodiscard olarak tanımlanan bir fonksiyon veya değere göre nodiscard olarak tanımlanan bir enumeration veya class döndüren bir fonksiyon, void'e dönüştürme dışında bir discard edilen değer ifadesinden çağrılırsa, compiler bir uyarı vermesi önerilir.


[[nodiscard]] int foo(int);

[[nodiscard ("foo should be return a value")]] int foo(int);
*****************************     
AÇIKLAMA : c++17
*****************************    
  • türleri de niteleyebilir.

class [[nodiscard]] Data {};

Data foo()
{
    return Data{};
}

int main ()
{
    auto val = foo();
}
*****************************     
AÇIKLAMA : [[nodiscard]] bir sınıfa uygulandığında, bu sınıftan döndürülen bir nesne kullanılmazsa derleyici uyarı verecektir.
Burada Data sınıfına [[nodiscard]] eklediğimiz için, eğer foo() fonksiyonundan dönen nesneyi kullanmazsak derleyici bir uyarı verecektir.
Ancak, auto val = foo(); satırında dönen değer bir değişkene atanarak kullanıldığı için uyarı oluşmaz.
*****************************     
CEVAP : legal
*****************************

class [[nodiscard]] Data {};

Data foo()
{
    return Data{};
}

int main ()
{
    foo();
}
*****************************     
CEVAP : derleyici uyarı verir...
*****************************

enum [[nodiscard]] Planets 
{
    Mercury,
    Venus,
    Mars,
    Earth
};

Planets foo();

int main ()
{
    foo();
}
*****************************     
AÇIKLAMA :  UYARI: 'nodiscard' özniteliği nedeniyle dönüş değeri kullanılmalı
*****************************     
CEVAP : derleyici uyarı verdi.
*****************************

  • Sınıfların üye fonksiyonları da [[nodiscard]] olarak nitelenebilir


class Data {
public :
    [[nodiscard]] int foo()
    {
        return 1;
    }
};

int main ()
{
    Data val;
    val.foo();
}
*****************************     
CEVAP : derleyici uyarı verir...
*****************************

  • implicitly olarak kullanmak uyarı verilmesini gerektirmez.

[[nodiscard]] int foo()
{
    return 1;
}

int main ()
{
    if (foo())
    {
        cout << "foo";
    }
}
*****************************     
AÇIKLAMA : Dönüş değeri doğrudan koşulda kullanılıyor
*****************************     
CEVAP : derleyici uyarı vermez.
*****************************

int main ()
{
    std::vector vec{ 3, 5, 8, 6 };

    std::max_element(vec.begin(), vec.end());
}
*****************************     
AÇIKLAMA : std::max_element() fonksiyonunun dönüş değerini kullanmadığınız için derleyicinin uyarı verir
*****************************     
CEVAP : derleyici uyarı verir...
*****************************

  • Sınıfların kurucu işlevleri(constructor) [[nodiscard]] olarak nitelenebilir

class Data {
public :
    Data(int){}
};

int main ()
{
    Data{ 10 };
} 
*****************************     
CEVAP : derleyici uyarı vermez
*****************************

class Data {
public :
    [[nodiscard]] Data(int){}
};

int main ()
{
    Data{ 10 };
}
*****************************     
CEVAP : derleyici uyarı verir...
*****************************

class Data {
public :
    [[nodiscard]] Data(int){}
};

int main ()
{
    static_cast<Data>(10);
}
*****************************     
AÇIKLAMA : c++20
*****************************     
CEVAP : derleyici uyarı verir...
*****************************
  • Fonksiyonun return değeri reference ya da pointer ise geri dönüş değerini kullanmak zorunda değildir.


class Data {};

Data& foo();

int main ()
{
    foo();
}
*****************************     
CEVAP : derleyici uyarı vermez.
*****************************

 
 
 

Recent Posts

See All
C++ Dilinde constinit

C++20'de tanıtılan önemli bir özellik `constinit`'dir; bu özellik, statik depolama süresine sahip değişkenlerin derleme zamanında...

 
 
 

Comments


bottom of page