2009-12-14 13 views
6

intenté compilar el código siguiente en Linux y VS 2008:C++ diferencias compilador (VS2008 y 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]; 

} 

Esta línea funciona en la versión g ++, pero no funciona en el Visual Studio. Se lanza el siguiente error:

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 

¿Es esta una declaración válida ?? ¿Cómo pueden dos compiladores tienen diferente interpretación de la misma langauge

+1

¿Cuál es su escenario de el compilador para usar en Visual Studio? El valor predeterminado es Microsoft Visual C++. GCC, sin embargo, compila ISO C++. No son lo mismo: hay algunas cosas que son legales en la implementación de C++ de Microsoft que no son legales en ISO C++ y viceversa. –

+0

@thomas: ¿Hay alguna forma de cambiarlo a la configuración ISO C++? Me gustaría que el código escrito para que uno funcione en la otra máquina. Los que no involucran llamadas al sistema al menos. – tomkaith13

+0

g ++ no usa ISO C++ de forma predeterminada, usa ISO con extensiones de GNU. Si quiere C++ estándar, use el indicador -entético (y luego el VLA fallará en gcc, ya que no es estándar). Para obtener C++ estándar en Visual Studio, evite cualquier tipo de proyecto con "CLR" en el nombre y use la opción/Za para deshabilitar las extensiones. –

Respuesta

14

Esta es una característica C99:

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

GCC soporta muchas características de C99, pero no lo hace VC y creo que no lo hará en un futuro próximo futuro porque se están concentrando en C++ cada vez más. De todos modos, sólo podría cambiar la declaración de:

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

¿Quieres decir que se están concentrando en C#? –

+4

No, C++. El compilador generalmente se conoce como Visual C++. Sucede que C++ se bifurcó desde c89, por lo que es fácil para los compiladores C++ ofrecer un modo C89 para el código C heredado. Pero apoyar C99 es mucho más trabajo. – MSalters

+4

Además, las características de C99 como VLA no son parte de Standard C++, o incluso de C++ 0x, por lo que MS tiene razón para no admitir tem, en mi humilde opinión. –

1

en C++ Microsoft, no es válida para crear matriz cuyo tamaño no puede ser determinado en tiempo de compilación en la pila. Debe crear la matriz en el montón o usar una constante para especificar el tamaño de la matriz.

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

No creo que esto tenga que ver con Microsoft. En C++ estándar , esto no es correcto. Consulte la respuesta de @Neil para obtener más detalles sobre por qué GCC lo permite. – AraK

3

trate de cambiar a int aconst int a. El estándar de C++ establece que el tamaño de las matrices debe ser una expresión constante. La definición de una expresión constante es (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 no es una expresión de la constante de acuerdo con esta definición.

9

Todos los compiladores implementan el estándar C++ de maneras sutilmente diferentes. Sin embargo, los problemas que obtienes con g ++ se deben a que, de forma predeterminada, permite muchas extensiones de idioma. Para obtener advertencias sobre estos, usted debe siempre compilar con al menos el -Wall y banderas -pedantic:

g++ -Wall -pedantic myfile.cpp 

que dará a los siguientes errores/advertencias:

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

Incluso sin -Wall o -pedantic, recibo una advertencia de que el encabezado Xh está en desuso, con el obtengo los errores no definidos de cout, como era de esperar, ya que la versión utiliza el espacio de nombres global no estándar. –

Cuestiones relacionadas