127 votes

Pourquoi auto un = 1 ; compiler en C ?

Le code:

int main(void)
{
    auto a=1;
    return 0;
}

obtient compilé sans erreurs par le MS Visual Studio 2012 compilateur, lorsque le fichier a la .c extension. J'ai toujours pensé que lorsque vous utilisez l' .c extension, la compilation devrait être conforme à la syntaxe du C et pas du C++. En outre, pour autant que je sais de l'automobile sans un type est autorisé uniquement en C++ depuis C++11, où il signifie que le type est déduite à partir de l'initialiseur.

Est-ce à dire que mon compilateur n'est pas de coller à C, ou est le code correct en langage C?

242voto

larsmans Points 167484

auto est un vieux C mot qui signifie "locale". auto a est le même que auto int a, et parce qu'une portée locale est la valeur par défaut pour une variable déclarée à l'intérieur d'une fonction, c'est aussi le même que int a dans cet exemple.

Ce mot-clé est en fait un vestige de C prédécesseur B, où il n'y avait pas de types de base: tout ce qui a été int, pointeur int, tableau de int.(*) Les déclarations seraient en auto ou extrn [sic]. C hérité de la "tout est int" comme une règle par défaut, de sorte que vous pouvez déclarer des entiers avec

auto a;
extern b;
static c;

C ISO à se débarrasser de cette, mais beaucoup de compilateurs encore l'accepter pour des raisons de compatibilité descendante. Si cela semble familier, alors vous devriez vous rendre compte que la règle est à l'œuvre dans

unsigned d;  // actually unsigned int

ce qui est encore commune dans un code moderne.

C++11 a réutilisé le mot-clé, qui peu si tous les programmeurs en C++ ont été à l'aide avec le sens original, pour son inférence de type. C'est surtout en sécurité parce que le "tout est int" règle de C avait déjà été abandonné en C++98; la seule chose qui casse est auto T a, ce qui n'était à l'aide de toute façon. (Quelque part dans ses mémoires sur l'histoire de la langue, Stroustrup commentaires à ce sujet, mais je ne trouve pas la référence exacte droit maintenant.)

(*) La manipulation des chaînes de B est intéressante: vous pouvez utiliser des tableaux de int et pack de plusieurs personnages dans chaque membre. B était en fait BCPL avec une syntaxe différente.

35voto

David Hammen Points 17912

C'est à la fois une réponse et d'une étendue commentaire Non, ce n'est pas légal C depuis 1999. Aucun décent moderne compilateur C permet de faire cela.

Oui, auto a=1; est illégal dans C1999 (et aussi C2011). Juste parce que c'est maintenant illégal ne signifie pas qu'un moderne compilateur C devrait rejeter code qui contient de telles constructions. Je dirais exactement le contraire, qu'un décent moderne compilateur C doit toujours permettre à pour cela.

Les deux clang et gcc ne vient que lors de la compilation de l'exemple de code dans la question à l'encontre de l'1999 ou 2011 versions de la norme. Les deux compilateurs émettre un diagnostic et ensuite faire comme si la répréhensible déclaration avait été auto int a=1;.

À mon avis, c'est ce qu'un compilateur décent devrait le faire. Par l'émission d'un diagnostic, clang et gcc sont pleinement conformes à la norme. La norme ne dit pas qu'un compilateur doit rejeter illégal code. La norme ne fait que dire que de la conformation de la mise en œuvre doit produire au moins un message de diagnostic si une unité de traduction contient une violation de toute règle de syntaxe ou de contrainte (5.1.1.3).

Compte tenu de code qui contient des constructions illégales, tout décent compilateur va essayer de donner un sens à l'illégal code pour que le compilateur puisse trouver la prochaine erreur dans le code. Un compilateur qui s'arrête à la première erreur n'est pas un très bon compilateur. Il existe un moyen de donner du sens à la de la auto a=1, ce qui est d'appliquer la "implicite int" la règle. Cette règle force le compilateur à interpréter auto a=1 comme si c'était auto int a=1 lorsque le compilateur est utilisé dans C90 ou K&R mode.

La plupart des compilateurs généralement rejeter code (reject: refuser de générer un fichier objet ou d'un fichier exécutable) qui contient de la syntaxe illégale. C'est un cas où le compilateur auteurs ont décidé qu'à défaut de compiler n'est pas la meilleure option. La meilleure chose à faire est d'établir un diagnostic, de corriger le code, et de poursuivre. Il y a juste trop de code legacy qui est parsemé de constructions telles que register a=1;. Le compilateur doit être capable de compiler ce code dans C99 ou C11 mode (avec un diagnostic, bien sûr).

29voto

BoBTFish Points 6610

auto a un sens en C et C++ avant le 2011 Standard. Cela signifie qu'une variable automatique de la durée de vie, qui est, à durée de vie déterminée par le champ d'application. C'est par opposition à, par exemple, static de vie, où une variable dure "pour toujours", indépendamment de la portée. auto est la durée de vie par défaut, et n'est presque jamais énoncé explicitement. C'est pourquoi il était sûr d'en modifier le sens en C++.

Maintenant, en C, avant l'99 Standard, si vous ne spécifiez pas le type d'une variable, la valeur par défaut est int.

Donc, avec auto a = 1; vous déclarez (et définition) int variable, avec une durée de vie déterminée par le champ d'application.

("durée de vie" est plus correctement appelé "durée de conservation", mais je pense que c'est peut-être moins clair).

8voto

Mike Seymour Points 130519

En C, et de l'historique des dialectes de C++, auto est un mot-clé, ce qui signifie que a dispose d'un système automatique de stockage. Puisqu'il ne peut être appliquée aux variables locales, qui sont automatiques par défaut, personne ne l'utilise; c'est pourquoi le C++ est maintenant redéfini le mot-clé.

Historiquement, C a permis de déclarations de variables sans spécificateur de type, le type par défaut est int. Donc, cette déclaration équivaut à

int a=1;

Je pense que c'est déconseillé (et, éventuellement, interdit) dans moderne C; mais certains populaire compilateurs par défaut pour C90 (ce qui, je pense, ne le permettent), et, fâcheusement, de n'activer les mises en garde si vous demandez spécifiquement pour eux. Compilation avec GCC et que ce soit en spécifiant C99 avec -std=c99, ou de l'activation de l'alerte avec -Wall ou -Wimplicit-int, donne un avertissement:

warning: type defaults to ‘int' in declaration of ‘a'

5voto

hvd Points 42125

C, signifie la même chose dans C ++11 : cela signifie que la variable a durée de mémorisation automatique.

Et c avant C99 (et compilateur de Microsoft ne supporte pas le C99 ou C11, mais il peut supporter des parties de celui-ci), le type peut être omis dans de nombreux cas, où il sera par défaut `` .

Il ne tient pas du tout du type de l’initialiser. Vous arrivé juste à choisir un initialiser compatible.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X