web-dev-qa-db-fra.com

Attribut de style C ++ 11 [[non utilisé]] dans gcc?

Sous gcc/g ++ 4.9 je peux écrire:

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

pour indiquer que x est intentionnellement inutilisé.

Est-il possible de le faire avec le C++ 11 [[]] notation d'attribut en quelque sorte?

J'ai essayé:

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

mais ça ne marche pas.

(Oui, je sais que c'est un attribut défini par l'implémentation.)

19
Andrew Tomazos

Oui, utilisez [[gnu::unused]]

Comme déjà dit, unused ne fait pas partie des attributs standard spécifiés par la norme.

La norme permet également d'utiliser des attributs définis par l'implémentation, comme ceux __attribute__ Et __declspec, Avec la nouvelle syntaxe. Si un compilateur ne reconnaît pas un attribut (un attribut gcc lors de la compilation sur MSVC comme exemple), il sera simplement ignoré. (probablement avec un avertissement)

Pour gcc, vous pouvez utiliser le préfixe gnu et la syntaxe d'attribut C++ 11: [[gnu::unused]] Au lieu de __attribute__((unused)) il en va de même pour les autres attributs gcc.

exemple sans préfixe gn

exemple avec préfixe gn

18
user1942027

Il y a [[maybe_unused]] attribut en C++ 17. Il est implémenté dans GCC 7, voir Prise en charge des normes C++ dans GCC .

Exemple de proposition P0212R1 :

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

La chose à laquelle vous faites référence est connue sous le nom de spécificateurs d'attribut . Il s'agit d'une tentative de normalisation de divers spécificateurs, dépendants de la plateforme:

Comme vous pouvez le voir dans le lien doc ci-joint, les seuls spécificateurs pris en charge dans C++ 11 sont:

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

et en C++ 14:

  • [[deprecated]] (Également pris en charge comme: [[deprecated("reason")]])

La réponse est donc: non, ce n'est pas possible, en utilisant uniquement les fonctionnalités C++ 11 .


Si vous n'êtes pas intéressé seulement par les solutions portables, il pourrait y avoir un moyen. La norme C++ ne limite pas cette liste:

Seuls les attributs suivants sont définis par la norme C++. Tous les autres attributs sont spécifiques à l'implémentation.

Divers compilateurs peuvent prendre en charge certains spécificateurs non standard. Par exemple, vous pouvez lire cette page afin de savoir que Clang prend en charge:

  • [[gnu::unused]]

Peut-être que votre version de GCC prend également en charge ce spécificateur. Cette page contient un rapport de bogue faisant référence à la prise en charge des attributs généralisés. [[gnu::unused]] Est également mentionné.

10
Mateusz Grzejek