2015-08-09 10 views
5

Pod gcc/g ++ 4.9 mogę napisać:C++ 11-style [[nieużywane]] atrybut w gcc?

int x __attribute__((unused)) = f(); 

, aby wskazać, że x jest celowo niewykorzystana.

Czy można to zrobić z notacją atrybutów C++ 11 [[]]?

Próbowałem:

int x [[unused]] = f(); 

ale to nie działa.

(Tak, wiem, że jest atrybutem wdrożenie zdefiniowane).

+0

Dlaczego uważasz, że to działa? Widziałeś jakieś specyfikacje językowe? – texasbruce

+0

I nie, to nie działa. To tylko rozszerzenie gcc. Not language specs – texasbruce

+0

To nie pasuje idealnie do twojego pytania jako odpowiedzi, ale [mój komentarz poniżej] (http://stackoverflow.com/questions/31909631/c11-style-unused-attribute-in-gcc#comment51735300_31909665) może Cię zainteresować . –

Odpowiedz

6

Tak, użyj [[gnu::unused]]

Jak już powiedział unused nie jest częścią standard attributes określonej przez normę.

Standard umożliwia implementację zdefiniowanych atrybutów, takich jak __attribute__ i __declspec, które mają być używane z nową składnią. Jeśli kompilator nie rozpoznaje atrybutu (atrybutu gcc podczas kompilowania w MSVC jako przykładu), po prostu zostanie zignorowany. (prawdopodobnie z ostrzeżeniem)

Dla gcc możesz użyć przedrostka gnu i składni atrybutu C++ 11: [[gnu::unused]] zamiast __attribute__((unused)) to samo powinno dotyczyć także innych atrybutów gcc.

example without gnu prefix

example with gnu prefix

8

Rzecz masz na myśli znany jest jako attribute specifiers. Jest próbą ujednolicenia różnych, platforma zależne, Specyfikatory:

Jak widać w załączonym linku do dokumentu, jedynymi specyfikatorami obsługiwanymi w C++ 11 są:

  • [[noreturn]]
  • [[carries_dependency]]

i C++ w 14:

  • [[deprecated]] (również obsługiwane jako: [[deprecated("reason")]])

Więc odpowiedź brzmi: nie , nie jest to możliwe, używając tylko C++ 11 feat i.


Jeżeli nie jesteś zainteresowany tylko w przenośnych rozwiązań, nie może być sposobem. Standard C++ nie ogranicza tej listy:

Tylko następujące atrybuty są zdefiniowane przez standard C++. Wszystkie pozostałe atrybuty są zależne od implementacji.

Różne kompilatory mogą obsługiwać niektóre niestandardowe specyfikatory. Na przykład, można przeczytać this page aby dowiedzieć się, że Clang obsługuje:

  • [[gnu::unused]]

Być może Twoja wersja GCC obsługuje także to specyfikator.This page zawiera raport o błędzie odnoszący się do obsługi atrybutów ogólnych. [[gnu::unused]] jest również wymieniony.

+0

Ben Deane wymyślił interesujące rozwiązanie C++ 11, które dodałem jako [odpowiedź tutaj] (http://stackoverflow.com/a/31654792/1708801), oczywiście opiera się na optymalizatorze, ale nie widziałem żadnego to jeszcze nie działa dobrze. –

+0

@ShafikYaghmour Interesujący pomysł, chociaż nie sądzę, że jest to dobre rozwiązanie. W takim przypadku może * lub nie * zostać zoptymalizowany. atrybut "nieużywany" jest bardziej wyraźny i przewidywalny. Co więcej, każda znana platforma ma jakąś formę "nieużywanego", więc najlepszym * wieloplatformowym * rozwiązaniem byłoby '# ifdef' i wspólne makro dla wszystkich platform - to prawdopodobnie najlepsze możliwe rozwiązanie (do czasu standaryzacji większej liczby atrybutów). –

+0

Prawdopodobnie zagram raport o błędzie, jeśli nie został on poprawnie zoptymalizowany, nie jestem pewien, czy użyłbym tej sztuczki, ale warto ją udokumentować, może się to okazać bardzo przydatne dla kogoś innego. –

2

Jest [[maybe_unused]] atrybut w C++ 17. Zaimplementowano go w GCC 7, patrz C++ Standards Support in GCC.

Przykład z P0212R1 proposal:

[[maybe_unused]] void f([[maybe_unused]] bool thing1, 
         [[maybe_unused]] bool thing2) { 
    [[maybe_unused]] bool b = thing1 && thing2; 
    assert(b); 
}