2011-07-19 3 views
0

Comme tout le monde le sait, la norme C exige de déclarer les variables en haut du corps de la fonction. C++ permet de le déclarer n'importe où, juste avant qu'il ne soit utilisé. MSVC suit la norme lorsque vous travaillez avec des fichiers source .c et .cpp.MSVC vs GCC: déclaration de variable dans la fonction

GCC permet de déclarer des variables partout dans le corps de la fonction, même si le fichier source est .c

J'ai un grand nombre .c constituent des dossiers bien dans GCC et non en MSVC à cause de cela. Je ne peux pas les renommer tous en .cpp.

Existe-t-il un moyen simple de dire au compilateur MSVC de traiter les fichiers C comme C++?

+0

Il faut remarquer que C (en particulier C99) ne soit pas un sous-ensemble de C++, donc cela pourrait ne pas fonctionner. –

+0

Ce n'est pas en haut du corps de la fonction: c'est en haut du bloc (à l'intérieur du bloc). L'extrait suivant est valide C: 'int main (void) {int a; {int top_of_block; top_of_block = 42; } a = 42; return 0;} ' – pmg

+1

Je ne veux pas décourager les questions honnêtes, mais vous semblez très peu familier avec les normes C (en particulier C89 et C99) pour commencer votre question avec" Comme tout le monde le sait ... " –

Répondre

4

La norme C89 l'exigeait. Le C99 actuel ne l'est pas. Quoi qu'il en soit, le commutateur est /TP pour traiter tous les fichiers d'entrée en C++ et /Tp<file> pour traiter une sélection - gardez à l'esprit que cela ne peut rien réparer, mais aussi introduire de nouvelles erreurs et il va déformer les noms, donc interop peut être blesser.

La meilleure solution serait de simplement compiler la partie C avec GCC.

+1

Il est assez choquant que VC ** 2010 ** n'implémente pas encore C99. Quelle est la justification de cela? –

+1

@Kerrek MSVC est un compilateur C++ avec des caractéristiques C sélectionnées. Ils avaient un rapport de "bogue" ou une demande de fonctionnalité pour la compatibilité totale de C99 mais ils l'ont rejetée avec la logique que j'ai énoncée dans la première phrase. – RedX

+0

@RedX: Intéressant. N'y a-t-il pas de compilateur C dédié créé par Microsoft? –

2

Le paramètre/TP permet de compiler tout fichier en tant que fichier C++ et/TC en tant que fichier C. Mais malheureusement, il s'agit d'un paramètre par fichier. Donc, vous devrez définir ceci pour chaque fichier. Peut-être que vous pouvez faire cela avec un petit script et analyser le fichier .vcproj et remplacer/TC avec/TP.

+0

Merci, c'est mieux que rien! –

3

Dans VisualStudio 2010, accédez aux propriétés de votre projet. Accédez aux propriétés de configuration -> C/C++ -> Avancé

Pour "compilation effectuée", sélectionnez « Compiler comme

code C++ (/ TP) Cela semble appliquer à tous les fichiers .c et .cpp dans le. projet.

Questions connexes