8
votes

Comment utiliser le mot-clé __attribute__ dans GCC C?

Je ne suis pas clair avec l'utilisation de __ attribut __ Mot-clé à C.I avait lu les documents pertinents de GCC mais je ne suis toujours pas capable de comprendre cela.

c gcc

5 commentaires

Vous avez une très bonne explication ici: GCC.GNU.ORG/ONLINDOCS/GCC/ Fonction-attributs.html . La question est. De quoi en avez-vous besoin exactement? Cela aiderait.


Essayez de poster un exemple spécifique que vous rencontrez des difficultés à comprendre


Allez-y Unixwiz.net/techtips/gnu-c-attributes.html


... et notez que ce n'est pas c, il s'agit du compilateur GCC. Utiliser Attribut n'est pas portable.


La GCC a été suffisamment influente que les gccismes soient soutenus par d'autres compilateurs. Clang prend en charge un certain nombre d'attributs GCC et PCC semble avoir un support partiel pour eux.


4 Réponses :


3
votes

Il y a trop d'attributs pour y avoir une seule réponse, mais des exemples aident. Par exemple, __ attribut __ ((aligné (16))) permet au compilateur d'aligner sur une limite de pile de 16 bits.

__ attribut __ (((NORÉTURN)) Indique au compilateur Cette fonction n'atteint jamais la fin (E.G. Fonctions standard telles que Quitter (int) )

__ attribut __ ((toujours_inline)) rend le compilateur en ligne que la fonction même si elle ne choisirait pas normalement (à l'aide du mot-clé en ligne suggère au compilateur que vous voudriez avoir l'inlinage, mais c'est libre de vous ignorer - cet attribut force cela).

Essentiellement, ils sont surtout à dire au compilateur que vous connaissez mieux que cela, ou pour le comportement du compilateur par défaut sur une fonction par fonction de fonction.


0 commentaires

0
votes

L'une des caractéristiques les meilleures (mais peu connues) de GNU C est l'attribut Attribut , qui permet à un développeur de fixer des caractéristiques aux déclarations de fonction permettant au compilateur d'effectuer plus de vérification des erreurs. Il a été conçu de manière à être compatible avec des implémentations non-GNU et nous l'utilisons depuis des années de code hautement portable avec de très bons résultats.

Notez que Attribut orthographié avec deux souligneurs avant et deux après, et il y a toujours deux ensembles de parenthèses entourant le contenu. Il y a une bonne raison pour cela - voir ci-dessous. GNU CC doit utiliser la directive -Wall Compiler pour le permettre (oui, il existe un degré de contrôle des avertissements plus fin, mais nous sommes de très gros fans d'avertissements maximum de toute façon).

Pour plus d'informations, veuillez consulter http://unixwiz.net/techtips/gnu- c-attributs.html

lokesh venkateshiah


1 commentaires

J'ai écrit un programme après avoir lu les réponses #include int mycoscinction (int, int) int () {int A, b, c; printf ("Entrez 2 numéros \ n"); scanf ("% d,% d", & a, & b); c = myfunction (A, B); printf ("le résultat est% d", c); sortie 0; } int myfunction (int A, int b) {int C; retour c = a + b; } mais je ne suis pas capable de comprendre où est-ce que je propose Attribut . J'avais aussi essayé de formater le code ci-dessus mais lorsque je me connecte, je ne vois aucune option pour sélectionner le code pour mettre en évidence comme je l'ai fait dans le premier post.



4
votes

Pensez-y comme un moyen d'injecter la syntaxe dans le code source, qui n'est pas standard C, mais plutôt destiné à la consommation du compilateur GCC uniquement. Mais, bien sûr, vous injectionnez cette syntaxe pas pour le plaisir de celui-ci, mais plutôt de donner aux informations supplémentaires du compilateur sur les éléments auxquels il est attaché.

Vous voudrez peut-être instruire le compilateur d'aligner une certaine variable en mémoire à un certain alignement. Ou vous voudrez peut-être déclarer une fonction obsolète de sorte que le compilateur générera automatiquement un avertissement obsolète lorsque d'autres essaient de l'utiliser dans leurs programmes (utiles dans les bibliothèques). Ou vous voudrez peut-être déclarer un symbole comme un symbole faible, de sorte qu'il ne sera lié que dans un dernier recours, si toute autre définition ne figure pas (utile dans la fourniture de définitions par défaut).

Tout cela (et plus) peut être atteint en fixant les attributs appropriés aux éléments de votre programme. Vous pouvez les attacher à Variables et Fonctions .

Jetez un coup d'œil à tout ce groupe d'autres Extensions GCC à C . Le mécanisme d'attribut fait partie de ces extensions.


0 commentaires

10
votes

__ attribut __ ne fait pas partie de C, mais est une extension de GCC utilisée pour transmettre des informations spéciales au compilateur. La syntaxe de __ attribut __ a été choisie pour être quelque chose que le prétraiteur C accepterait et non modifier (par défaut, de toute façon), il ressemble beaucoup à un appel de la fonction. Ce n'est pas un appel de fonction, cependant.

Une grande partie des informations qu'un compilateur peut apprendre sur C code C (en le lisant), le compilateur peut utiliser les informations qu'il apprends via __ attribut __ de différentes manières - même en utilisant la même pièce de données de plusieurs manières, parfois.

L'attribut pure indique au compilateur qu'une fonction est en réalité une fonction mathématique - en utilisant uniquement ses arguments et les règles de la langue pour arriver à sa réponse sans aucun autre effet secondaire. En sachant que le compilateur peut être capable d'optimiser mieux lorsque vous appelez une fonction pure, mais il peut également être utilisé lors de la compilation de la fonction pure pour vous avertir si la fonction fait quelque chose qui le rend impur.

Si vous pouvez garder à l'esprit que (même si quelques autres compilateurs les prennent en charge) attributs sont une extension de la GCC et ne font pas partie de C et leur syntaxe ne correspond pas à C de manière élégante ( Seulement suffisamment pour tromper le préprocesseur), alors vous devriez être capable de les comprendre mieux.

Vous devriez essayer de jouer avec eux. Prenez celles qui sont plus facilement comprises pour les fonctions et essayez-les. Faites la même chose avec des données (cela peut aider à examiner la sortie de l'assemblage de GCC pour cela, mais taille de et la vérification de l'alignement aidera souvent).


0 commentaires