11
votes

Compilateur Microsoft C: Déclaration de variable en ligne?

J'écris C dans Visual Studio 2010. Le compilateur ne semble pas vouloir me permettre d'utiliser des déclarations variables en ligne. Le code suivant produit une erreur: xxx

erreur:

Erreur C2143: Erreur de syntaxe: manquant ';' avant 'type'

Erreur C2143: Erreur de syntaxe: manquant ';' avant 'type'

Erreur C2143: Erreur de syntaxe: manquant ';' avant 'type'

Pourquoi cela se produit-il? Y a-t-il un paramètre pour rendre le compilateur pas si strict?


0 commentaires

3 Réponses :


1
votes

Essayez de le compiler comme C ++. C99 permettra de déclarer des variables autres que le haut de la portée, mais VC ne sait pas environ C99.


1 commentaires

Comme le menthmay mentionne, C et C ++ ne sont pas entièrement compatibles au niveau source. en.wikipedia.org/wiki/compatibility_of_c_and_c++



1
votes

Les déclarations variables en ligne ne sont prises en charge que dans un compilateur compilant C99. Microsoft Visual C ++ ne semble pas être compatible C99 ( ref ). Vous allez devoir utiliser un compilateur compatible C99 (GCC compilera le code avec des variables en ligne lorsqu'il est utilisé avec -std = C99 ) ou déclarez vos variables en haut de la fonction.

Edit: ou essayez le mode C ++, comme suggéré par Akallio, bien que C et C ++ ne soit pas strictement compatible avec l'autre, de sorte que si (par exemple), vous utilisez des mots-clés spécifiques C ++ - spécifiques de votre code C, il a gagné ' t compiler.


1 commentaires

Mot-clé de côté, des règles différentes sur le moulage du pointeur et Enum / STRIT / Union Les espaces de noms peuvent également rendre le code C Safe C échec de la compilation en mode C ++. Il y a d'autres Tidbits, comme Tailleof ('A') == Tailleof (int) dans C mais Tailleof ('a') == Tailleof (Char) en C ++, mais En pratique, ce n'est pas une cause commune de problèmes.



10
votes

Mettre des déclarations après les non-déclarations n'est pas autorisée dans C89, bien qu'elle soit autorisée en C ++ et en C99 (MSVC ne prenne toujours pas en charge C99, cependant).

en C89, vous pouvez obtenir un effet similaire par Utilisation d'un bloc imbriqué: P>

unsigned int fibonacci_iterative(unsigned int n) {
    if (...) {
    }

    {
       unsigned int prev_prev = 0;
       unsigned int prev = 1;
       unsigned int next = 0;
       ...
    }
 }


4 commentaires

Un peu désordonné, n'est-ce pas? Tout le reste de la fonction qui fait référence à ces variables devra être à l'intérieur du bloc afin que les variables ne sortent pas de portée. En cas de surutilisée, cela conduira à très Code Heavy Messy et Brace-Heavy.


@Chinmay: Cela dépend. Oui, cela pourrait se mettre en désordre pour de grands blocs, mais il peut également être utile pour de petits blocs où certaines variables n'ont besoin que d'une portée très limitée.


Comment est-ce portable? Cela semble que cela pourrait demander des ennuis.


@JOELB: C'est standard C89, il devrait donc être complètement portable.