2009-12-14 6 views
6

J'ai essayé de compiler le code suivant dans Linux et VS 2008:C++ différences de compilateur (VS2008 et g ++)

#include <iostream> // this line has a ".h" string attached to the iostream string in the linux version of the code 
using namespace std; // this line is commented in the linux version of the code 
void main() 
{ 

    int a=100; 
    char arr[a]; 

    arr[0]='a'; 
    cout<<"array is:"<<arr[0]; 

} 

Cette ligne fonctionne dans la g ++ version, mais ne fonctionne pas dans Visual Studio. Il jette l'erreur suivante:

1>c:\users\bibin\documents\visual studio 2008\projects\add\add\hello.cpp(7) : error C2057: expected constant expression 
1>c:\users\bibin\documents\visual studio 2008\projects\add\add\hello.cpp(7) : error C2466: cannot allocate an array of constant size 0 
1>c:\users\bibin\documents\visual studio 2008\projects\add\add\hello.cpp(7) : error C2133: 'arr' : unknown size 

Est-ce une déclaration valable ?? Comment deux compilateurs ont une interprétation différente de la même langauge

+1

Quelle est votre réglage pour le compilateur à utiliser dans Visual Studio? La valeur par défaut est Microsoft Visual C++. GCC, cependant, compile ISO C++. Ils ne sont pas identiques - il y a certaines choses qui sont légales dans l'implémentation de C++ de Microsoft qui ne sont pas légales dans ISO C++ et vice versa. –

+0

@thomas: Y a-t-il un moyen de le changer en ISO C++? Je voudrais que le code écrit pour que quelqu'un travaille dans l'autre machine. Ceux qui n'impliquent pas les appels système au moins. – tomkaith13

+0

g ++ n'utilise pas ISO C++ par défaut, il utilise ISO avec les extensions GNU. Si vous voulez le C++ standard, utilisez le drapeau -pedantic (et alors le VLA échouera sur gcc, puisqu'il est non-standard). Pour obtenir le standard C++ dans Visual Studio, évitez tout type de projet avec "CLR" dans le nom et utilisez l'option/Za pour désactiver les extensions. –

Répondre

14

Ceci est une caractéristique de C99:

char arr[a]; // VLA: Variable Length Arrays (C99) but not C++! 

GCC supporte de nombreuses fonctionnalités de C99, mais VC ne fonctionne pas et je pense que ce ne sera pas dans un proche avenir car ils se concentrent de plus en plus sur C++. Quoi qu'il en soit, vous pouvez simplement changer la déclaration:

const int a=100; // OK the size is const now! 
    char arr[a]; 
+1

Vous voulez dire qu'ils se concentrent sur C#? –

+4

Non, C++. Le compilateur est généralement appelé Visual C++. Il arrive que C++ soit forké à partir de c89, donc il est facile pour les compilateurs C++ d'offrir un mode C89 pour le code C hérité. Mais soutenir C99 est beaucoup plus de travail. – MSalters

+4

En outre, les fonctionnalités C99 comme VLA ne font pas partie de la norme C++, ou même de C++ 0x, donc MS ont raison de ne pas supporter tem, à mon humble avis. –

1

dans Microsoft C++, ce n'est pas valide pour créer une matrice dont la taille ne peut pas être déterminée au moment de la compilation sur la pile. Vous devez créer le tableau sur le tas ou utiliser une constante pour spécifier la taille du tableau.

char *arr = new char[size]; 
const int size2 = 100; 
char arr2[size2]; 
+0

Je ne pense pas que cela a à voir avec Microsoft. Voir @Neil answer pour plus de détails pourquoi GCC permet cela – AraK

3

Essayez de changer int a à const int a. La norme C++ stipule que la taille des tableaux doit être une expression constante. La définition d'une expression constante est (5.19.1):

In several places, C + + requires expressions that evaluate to an integral or enumeration constant: as array bounds (8.3.4, 5.3.4), as case expressions (6.4.2), as bit-field lengths (9.6), as enumerator initializers (7.2), as static member initializers (9.4.2), and as integral or enumeration non-type template arguments (14.3). constant-expression: conditional-expression An integral constant-expression can involve only literals (2.13), enumerators, const variables or static data members of integral or enumeration types initialized with constant expressions (8.5), non-type template parameters of integral or enumeration types, and sizeof expressions. Floating literals (2.13.3) can appear only if they are cast to integral or enumeration types. Only type conversions to integral or enumeration types can be used. In particular, except in sizeof expressions, functions, class objects, pointers, or references shall not be used, and assignment, increment, decrement, function-call, or comma operators shall not be used.

int a = 100 est pas une expression constante selon cette définition.

9

Tous les compilateurs implémentent le standard C++ de manière subtilement différente. Cependant, les problèmes que vous rencontrez avec g ++ sont dus au fait que, par défaut, il permet de nombreuses extensions de langage. Pour obtenir des avertissements au sujet de ces derniers, vous devriez toujours compiler avec au moins -Wall et drapeaux -pedantic:

g++ -Wall -pedantic myfile.cpp 

qui donnera les erreurs/avertissements suivants:

myfile.cpp:1:119: error: iostream.h: No such file or directory 
myfile.cpp:2: error: '::main' must return 'int' 
myfile.cpp: In function 'int main()': 
myfile.cpp:6: warning: ISO C++ forbids variable length array 'arr' 
myfile.cpp:9: error: 'cout' was not declared in this scope 
+0

Même sans -Wall ou -pedantic, j'obtiens un avertissement que l'en-tête Xh est déprécié, avec le je reçois les erreurs cout non définies, comme vous vous en doutez, la version utilise l'espace de noms global non std. –

Questions connexes