2009-12-14 15 views
6

ho cercato di compilare il seguente codice in Linux e VS 2008:C++ differenze compilatore (VS2008 e 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]; 

} 

Questa linea lavora nel g ++ versione, ma non funziona in Visual Studio. Getta il seguente errore:

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 

Si tratta di una dichiarazione valida ?? Come possono due compilatori avere diversa interpretazione della stessa langauge

+1

Qual è la sua impostazione per il compilatore da utilizzare in Visual Studio? L'impostazione predefinita è Microsoft Visual C++. GCC, tuttavia, compila ISO C++. Non sono la stessa cosa: ci sono alcune cose legali nell'implementazione di C++ da parte di Microsoft che non sono legali in ISO C++ e viceversa. –

+0

@thomas: Quindi c'è un modo per cambiarlo in ISO C++? Mi piacerebbe che il codice scritto per uno funzioni nell'altra macchina. Quelli che non coinvolgono chiamate di sistema almeno. – tomkaith13

+0

g ++ non usa ISO C++ di default, usa ISO con estensioni GNU. Se vuoi il C++ standard, usa il flag -pedantic (e quindi il VLA fallirà su gcc, dato che non è standard). Per ottenere C++ standard in Visual Studio, evitare qualsiasi tipo di progetto con "CLR" nel nome e utilizzare l'opzione/Za per disabilitare le estensioni. –

risposta

14

questa è una caratteristica C99:

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

GCC supporta molte caratteristiche di C99, ma VC non lo fa e penso che non lo farò nel prossimo futuro perché si stanno concentrando sempre più sul C++. In ogni caso, si può solo modificare la dichiarazione a:

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

Vuoi dire che si stanno concentrando su C#? –

+4

No, C++. Il compilatore è generalmente noto come Visual C++. Succede che il C++ sia stato biforcato da c89, quindi è facile per i compilatori C++ offrire una modalità C89 per il codice C legacy. Ma supportare C99 è molto più lavoro. – MSalters

+4

Inoltre, le funzioni C99 come VLA non fanno parte di Standard C++, o anche di C++ 0x, quindi MS ha ragione a non supportare TEM, IMHO. –

1

in Microsoft C++, non è valida per creare array la cui dimensione non può essere determinato al momento della compilazione sulla pila. È necessario creare l'array su heap o utilizzare una costante per specificare la dimensione dell'array.

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

Non penso che questo abbia a che fare con Microsoft. Vedere la risposta @Neil per ulteriori dettagli sul perché GCC lo consenta. – AraK

3

provare a cambiare int a a const int a. Lo standard C++ afferma che la dimensione degli array dovrebbe essere un'espressione costante. La definizione di un'espressione costante è (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 non è un'espressione costante secondo questa definizione.

9

Tutti i compilatori implementano lo standard C++ in modi leggermente diversi. Tuttavia, i problemi che si incontrano con g ++ sono perché di default abilita molte estensioni della lingua. Per ottenere avvertimenti su questi, si dovrebbe sempre compilare con almeno il -Wall e le bandiere -pedantic:

g++ -Wall -pedantic myfile.cpp 

che darà i seguenti errori/avvisi:

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

Anche senza il -Wall o -pedantic, ricevo un avviso che l'intestazione Xh è deprecata, con il Ottengo gli errori non definiti cout, come ci si aspetterebbe, in quanto la versione utilizza lo spazio dei nomi globale non std. –

Problemi correlati