web-dev-qa-db-fra.com

Où le mot-clé auto C est-il utilisé?

Au collège, j’ai lu des articles sur le mot-clé auto et, au fil du temps, j’ai oublié de quoi il s’agissait. Il est défini comme:

définit une variable locale comme ayant une durée de vie locale

Je n'ai jamais trouvé qu'il est utilisé nulle part, est-il vraiment utilisé et si oui, où est-il utilisé et dans quels cas?

90
Vijay

auto est un modificateur comme static. Il définit la classe de stockage d'une variable. Cependant, étant donné que le paramètre par défaut pour les variables locales est auto, vous n'avez normalement pas besoin de le spécifier manuellement.

Cette page liste les différentes classes de stockage en C.

79
Mehrdad Afshari

Si vous lisiez la liste IAQ (questions fréquemment posées), vous sauriez que auto est principalement utile pour définir ou déclarer un véhicule:

auto my_car;

Un véhicule toujours garé à l'extérieur:

extern auto my_car;

Pour ceux qui manquent d'humour et veulent "juste les faits, Madame", la réponse courte est qu'il n'y a jamais de raison d'utiliser auto du tout. La seule fois où vous êtes autorisé à utiliser auto est avec une variable qui a déjà la classe de stockage auto, vous spécifiez donc simplement quelque chose qui se produirait de toute façon. Si vous essayez d'utiliser auto sur une variable qui n'a pas encore la classe de stockage auto, le compilateur rejettera votre code. Je suppose que si vous voulez être technique, votre implémentation n'a pas besoin d'être un compilateur (mais c'est le cas) et elle peut théoriquement continuer à compiler le code après avoir émis un diagnostic (mais ce ne sera pas le cas).

Petit addendum de kaz :

Il y a aussi:

static auto my_car;

ce qui nécessite un diagnostic selon ISO C. Ceci est correct car il déclare que la voiture est en panne. Le diagnostic est gratuit, mais éteindre la lumière du tableau de bord vous coûtera quatre-vingts dollars. (Vingt ou moins, si vous achetez votre propre clé USB pour les diagnostics intégrés d’eBay).

Le _ précité extern auto my_car nécessite également un diagnostic. Pour cette raison, il n’est jamais traité par le compilateur, sauf par le personnel municipal chargé de faire respecter les règles de stationnement.

Si vous voyez beaucoup de extern static auto ... dans n'importe quelle base de code, vous êtes dans un mauvais quartier; cherchez un meilleur travail immédiatement, avant que l’endroit ne se tourne vers Rust.

118
Jerry Coffin

Le mot-clé auto est inutile en langage C. C'est là parce qu'il existait avant le langage C un langage B dans lequel ce mot clé était nécessaire pour déclarer des variables locales. (B a été développé en NB, qui est devenu C).

Voici le manuel de référence pour B .

Comme vous pouvez le constater, le manuel regorge d'exemples dans lesquels auto est utilisé. En effet, il n’existe pas de mot clé int. Une sorte de mot clé est nécessaire pour indiquer "il s'agit d'une déclaration de variable", et ce mot clé indique également s'il s'agit d'une variable locale ou externe (auto par rapport à extrn). Si vous n'utilisez pas l'un ou l'autre, vous avez une erreur de syntaxe. C'est-à-dire que x, y; N'est pas une déclaration en soi, mais auto x, y; L'est.

Étant donné que les bases de code écrites en B devaient être transférées vers NB et au fur et à mesure que le langage était développé, les versions les plus récentes du langage comportaient un bagage pour une compatibilité ascendante améliorée qui se traduisait par moins de travail. Dans le cas de auto, les programmeurs n’ont pas à rechercher chaque occurrence de auto et à la supprimer.

Il est évident d'après le manuel que le "int implicite" désormais obsolète en C (être capable d'écrire main() { ... } sans aucun int à l'avant) provient également de B. C'est une autre fonctionnalité de compatibilité ascendante à prendre en charge Code B. Les fonctions n'ont pas de type de retour spécifié dans B car il n'y a pas de types. Tout est un mot, comme dans beaucoup de langues de l'Assemblée.

Notez comment une fonction peut simplement être déclarée extrn putchar Puis la seule chose qui en fait une fonction dont l'identifiant utilise : il est utilisé dans une expression d'appel de fonction telle que putchar(x), et c'est ce qui indique au compilateur de traiter ce mot non typé comme un pointeur de fonction.

38
Kaz

En C auto est un mot clé qui indique qu'une variable est locale à un bloc. Etant donné que c'est la valeur par défaut pour les variables de type bloc, elle est inutile et très rarement utilisée (je ne pense pas l'avoir jamais vue utiliser en dehors des exemples dans les textes décrivant le mot clé). Je serais intéressé si quelqu'un pouvait signaler un cas où l'utilisation de auto était nécessaire pour obtenir une analyse ou un comportement correct.

Cependant, dans le standard C++ 11, le mot clé auto a été 'détourné' pour prendre en charge l'inférence de type, le type d'une variable pouvant être pris à partir du type de son initialiseur:

auto someVariable = 1.5;   // someVariable will have type double

L'inférence de type est ajoutée principalement pour prendre en charge la déclaration de variables dans les modèles ou renvoyée par des fonctions de modèle où les types basés sur un paramètre de modèle (ou déduits par le compilateur lorsqu'un modèle est instancié) peuvent souvent être assez pénibles à déclarer manuellement.

22
Michael Burr

Avec l'ancien compilateur Aztec C, il était possible de transformer toutes les variables automatiques en variables statiques (pour une vitesse d'adressage accrue) à l'aide d'un commutateur de ligne de commande.

Mais les variables explicitement déclarées avec auto ont été laissées telles quelles. (Un must pour les fonctions récursives qui autrement ne fonctionneraient pas correctement!)

9
raphnet

Le mot clé auto est similaire à l'inclusion de points-virgules dans Python; il était requis par un langage précédent ( B ), mais les développeurs ont compris qu'il était redondant, car la plupart des choses étaient auto.

Je suppose que cela a été laissé pour faciliter la transition de B à C. Bref, l’un des usages est la compatibilité en langage B.

Par exemple en B et 80 C

/* The following function will print a non-negative number, n, to
   the base b, where 2<=b<=10.  This routine uses the fact that
   in the ASCII character set, the digits 0 to 9 have sequential
   code values.  */

printn(n, b) {
        extrn putchar;
        auto a;

        if (a = n / b)        /* assignment, not test for equality */
                printn(a, b); /* recursive */
        putchar(n % b + '0');
}
6
Mikhail

Le mot-clé auto est une classe de stockage (une sorte de technique qui décide de la durée de vie d'une variable et d'un lieu de stockage), par exemple. Il a un comportement par lequel les variables créées par l'aide de ce mot clé ont une durée de vie (durée de vie) résidant uniquement dans les accolades

{
    auto int x=8;        
    printf("%d",x);  // here x is 8

    { 
        auto int x=3;
        printf("%d",x);  // here x is 3
    }              

    printf("%d",x);  // here x is 8
}          
0
Atul Sharma