IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Voir le flux RSS

Un bon développeur est un développeur flemmard !

[C] Quand le compilateur se prend pour ta mère...

Noter ce billet
par , 17/07/2015 à 11h37 (1172 Affichages)
Bonjour,

Hier, j'ai rencontré une erreur de compilation en passant d'un compilateur C Unix à un compilateur Windows.
error C2143: syntax error : missing ';' before 'type'
Après avoir retourner mon code dans tout les sens, j'ai fait une petite recherche sur l'erreur en question... Il semble que le compilateur "Windows", pour une raison qui m'échappe, ai décidé que toute déclaration de paramètre qui n'est pas en début de bloc est invalide syntaxiquement.

Du coup,

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
//Bon
{
	int maVariable =0;
	log("début de fonction");
}

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
 
//Pas Bon : Erreur de compilation
{
	log("début de fonction");
	int maVariable =0;
}

Note : Le cas où j'ai réellement rencontré le problème est sur une fonction de log de début de bloc. Et donc, qui se trouvait avant la déclaration d'un paramètre.
Je comprends la logique lié à cette contrainte ajouter sur le compilateur, mais étant de l'école "Declare where it's use". J'ai envie de dire "touche à ton cul"...

D'ailleurs, il y a un autre cas où j'ai eu l'erreur :

Code C : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
 
{
	int maVariableQuiADuSens = 42;
	utiliseUneVariable(maVariableQuiADuSens);
	// Ici un bon paquet de code bien moche
	int maVariableOfHell = 666; // Ici, erreur de compilation
	utiliseUneVariable(maVariableOfHell );
}
Et pour le coup, j'aurai bien aimer avoir les déclarations là où je les utilises et non en début de bloc.

Si vous connaissez d'autres erreur de ce style, n'hésitez pas à partager !

Cordialement,
Patrick Kolodziejczyk.

source :
Billet sur l'erreur en question (anglais)

Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Viadeo Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Twitter Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Google Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Facebook Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Digg Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Delicious Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog MySpace Envoyer le billet « [C] Quand le compilateur se prend pour ta mère... » dans le blog Yahoo

Catégories
Programmation , C

Commentaires

  1. Avatar de janselmeer
    • |
    • permalink
    Le comportement de ton compilateur Windows me semble tout à fait conforme au standard ANSI C qui spécifie que les déclarations se font en début de bloc.
    C'est plutôt ton compilateur Unix qui est plus permissif que le standard.
  2. Avatar de kolodz
    • |
    • permalink
    Je ne suis pas au fait du "standard" C. Du coup j'ai fait un peu de recherche dessus et je suis tombé sur cela :

    Citation Envoyé par RavuAlHemio
    I have recently become a teaching assistant for a university course which primarily teaches C. The course standardized on C90, mostly due to widespread compiler support. One of the very confusing concepts to C newbies with previous Java experience is the rule that variable declarations and code may not be intermingled within a block (compound statement).

    This limitation was finally lifted with C99, but I wonder: does anybody know why it was there in the first place? Does it simplify variable scope analysis? Does it allow the programmer to specify at which points of program execution the stack should grow for new variables?

    I assume the language designers wouldn't have added such a limitation if it had absolutely no purpose at all.
    Du coup, cela voudrait dire que le compilateur windows que j'utilise respecte le standard C90. Et que celui de mon Unix, soit ne le respecte pas, soit respecte un version C99 (ou supérieur)

    Un autre source dit ceci :

    [QUOTE]The biggest reason I know of is that it simplifies the language grammar and parser.

    With the declarations up front, a block of code must look like
    {
    <declarations>
    <stmts>
    }
    and consequently the definition of <stmts> is simplified because it doesn't have to involve declarations. This, in turn, simplifies the parser, since it need only disambiguate statements from declarations at the start of a block.

    In fact, this particular definition of the code block is codified in the standard:

    3.6.2 Compound statement, or block

    Syntax

    compound-statement:
    { declaration-list<opt> statement-list<opt> }

    declaration-list:
    declaration
    declaration-list declaration

    statement-list:
    statement
    statement-list statement[/CODE]
    Cependant, je n'ai pas été en mesure de retrouver les normes C90 et C99 et cette section sur la déclaration en question...


    source :
    http://stackoverflow.com/questions/7...n-up-until-c99
    http://stackoverflow.com/questions/1...s-and-code-why
  3. Avatar de dourouc05
    • |
    • permalink
    Les compilateurs Microsoft restent bloqués à C89 pour leur mode C ; pour le reste, il faut passer en mode C++ (/TP dans la ligne de commande). La justification principale est que leurs clients leur demandent très peu de C : ils implémentent de mieux en mieux C++, les évolutions de C nécessaires dans ce mode, mais pas un mode C un peu décent.
  4. Avatar de stendhal666
    • |
    • permalink
    Citation Envoyé par dourouc05
    Les compilateurs Microsoft restent bloqués à C89 pour leur mode C ; pour le reste, il faut passer en mode C++ (/TP dans la ligne de commande). La justification principale est que leurs clients leur demandent très peu de C : ils implémentent de mieux en mieux C++, les évolutions de C nécessaires dans ce mode, mais pas un mode C un peu décent.
    C'est tout à fait ça et c'est un peu triste. Si on veut un compilateur C conforme au standard récent il faut aller voir vers des UNIX (mais certains sont portés vers Windows). Je partage l'avis de Kolodz que cette idée de déclarations en début de bloc est devenu un anti-pattern aujourd'hui, à raison. C'est certainement pour faciliter la vie des programmeurs de compilateur que ça a été fait initialement.

    Cela étant il existe une façon de contourner mais qui n'est pas bien jolie non plus:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    void log_and_do_sthg() {
      log("blablabla")
      {
         int i = bloblo();
         ...
       }
    }
    Dans un bouquin de C moderne (en tout cas postérieur au standard C99), je ne me rappelle plus lequel, l'auteur disait: "c'est bien de profiter de cette nouvelle possibilité, mais attention, hein, pas d'excès du genre for (int i = 0; i < BUF_SIZE; ++i) Comme quoi les habitudes ont la vie dure.