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: erreur: p> Erreur C2143: Erreur de syntaxe: manquant
';' avant 'type' p>
Erreur C2143: Erreur de syntaxe: manquant
';' avant 'type' p>
Erreur C2143: Erreur de syntaxe: manquant
';' avant 'type' p>
BlockQuote> Pourquoi cela se produit-il? Y a-t-il un paramètre pour rendre le compilateur pas si strict? P> p>
3 Réponses :
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. P>
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++
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 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. p> -std = C99 code>) ou déclarez vos variables en haut de la fonction. p>
Mot-clé de côté, des règles différentes sur le moulage du pointeur et Enum / STRIT / Union Code> 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) Code> dans C mais
Tailleof ('a') == Tailleof (Char) Code> en C ++, mais En pratique, ce n'est pas une cause commune de problèmes.
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; ... } }
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 i> 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.