2016-07-21 18 views
10

C++ 17, [[maybe_unused]] özniteliğini sunar.
Bu, GCC ve Clang'ın standart bir sürümü olduğunu varsayalım: __attribute__((unused)).[[kullanılmamış]] işlev bildirimleri veya tanımları üzerine koydum mu?

Ben bir uyarı görmek istemiyoruz kullanılmayan işlevler için

,
ben

işlev bildirimleri üzerine niteliğini belirterek olmalıdır?

void maybe_used_function() [[maybe_unused]]; 

veya fonksiyon tanımları?

void maybe_used_function() [[maybe_unused]] { 
    /* impl */ 
} 

Ya bir? Her ikisi de?
Etki, standartlaştırılmış ve derleyiciye özgü özniteliklerde aynı olacak mı?
Yerleşim davranışı ve genel uygulamanın ne olduğu konusunda net bir belge bulamıyorum.


Bir tanım, GCC işlev gövdesinden önce niteliği yerleştirmek ve çınlama bir hata verdiği zaman:

void function(); 
int main(){} 
void function() __attribute__((unused)) {} 

uyarı: GCC izin vermez bu pozisyonda üzerinde 'kullanılmayan' nitelik bir fonksiyon tanımlama [-Wgcc-compat] void fonksiyonu() __attribute __ {() (kullanılmayan)


Ancak nitelik hatasız iki başka yerlerde yerleştirilebilir:

__attribute__((unused)) void __attribute__((unused)) function() {} 

Belki bu yollardan biri ben fonksiyon tanımlarında özellik kullanmak için bekliyorunuz nasıl? N4606 kaynaktan

+0

Siz * deneyin ve derleyicinin gerçekte ne dediğini gördünüz mü? AFAIK, öznitelikler yalnızca * bildirimlerine dayanıyor, ancak standart metni iki kere kontrol etmedim. –

+0

@JesperJuhl: Bu durumda derleyici yanlıştır ve bu özellikle, özellikle (ya da hiç) doğru şekilde uygulanabilen ya da uygulanamayan _upcoming_ dil özellikleri tartışılırken olağandışı olmaktan uzaktır. – ildjarn

+0

@ llljarn GCC hatası, '__attribute __ ((kullanılmamış))' 'değil [[belki_unused]]' dan geliyordu. Clang aynı şeyi yapıyor gibi görünüyor. –

cevap

5

[dcl.attr.unused] ¶ 4.:

A name or entity declared without the maybe_unused attribute can later be redeclared with the attribute and vice versa. An entity is considered marked after the first declaration that marks it.

bir işlev tanımı bir bildiri olduğu ([dcl.dcl] ¶1), bu her iki yere koymak anlamına ve aynı davranacaktır.

(O niteliği yalnızca fiilen tanımını etkilediğinden anlamda her iki yerde de izin verilmesi için yapar, ama nitelik kendini belgelere olarak hizmet edebilir çünkü ilanı konusunda izin de içindir.)

19

ne.

[[attr1]] void [[attr2]] f [[attr3]]() [[attr4]] {} 
  • attr1 ve attr3 mensubu

    (veya geçerli) kendisi f için. void, void numaralı türeve ait
  • attr2.
  • attr4 appertains f 'ın tipi ("() işlevi void dönen) değil f.

Sen f mensubu için maybe_unused istiyorsanız, pozisyon 1 veya 3'te koymak böylece, ancak 2 veya 4.

@ildjarn's answer kalanını kapsar. GCC en __attribute__ için

, onun belgelerini kontrol etmek gerekir.

İlgili konular