2011-11-03 11 views
5
const int num = 16; 
struct inputs{ 
     double X1[num]; 
     double X2[num]; 
}; 

me da un error:Diferencias matriz de tamaño Declaración para C y C++

error: variably modified ‘X1’ at file scope

El mismo fue cierto para 'X2'.

Pero recuerdo que lo anterior está bien para C++, lo anterior está bien (me pueden confundir con C++).

¿Alguien puede aclarar esto para mí?

Respuesta

3

Sí, hay una diferencia. En C, una variable const aún no se trata como una constante de compilación en tiempo real (oficialmente, no se permite una parte de un constant expression), por lo que no está permitido. Sin embargo, tenga en cuenta que aunque C no requiere que el compilador lo permita, la norma otorga permiso para que una implementación acepte otras formas de expresiones constantes, por lo que es libre de aceptarlo si lo desea.

En C++, una variable const se trata como una constante, por lo que está permitida.

Curiosamente, más o menos lo contrario es cierto cuando se utiliza un valor pasado como un parámetro de la función:

void f(int size) { 
    int array[size]; 
} 

Este es permitido en C, pero no en C++. Esta es una matriz variably modified; el mensaje de error que está recibiendo básicamente está tratando de decirle que estos solo están permitidos dentro de las funciones.

+0

En C, ¿puede pasar el tamaño de una matriz a una función? ¡Aprendido! ¡Gracias! – Rich

+0

@Rich: sí, pero solo si su compilador cumple con C99 (al menos a este respecto) - esto no estaba incluido en C89/90 (aunque era una extensión bastante común incluso con compiladores más antiguos). –

0

No en struct. Puedes hacerlo en el ámbito local.

+0

Incluso para C? De acuerdo con otras respuestas, no es posible para C. ¿quizás está bien para C++? – Rich

+3

Solo en C99, no en C89. –

+0

Confío en Adam, porque no recuerdo los estándares exactos. Su versión suena plausible. –

0

Tiene que usar un valor constante. Entonces en C tienes que usar un #define en este sentido. Para C++ hubiera estado bien.

Uso este lugar:

#define num 16 
struct inputs{ 
    double X1[num]; 
    double X2[num]; 
}; 
+0

err .. '# define' en el alcance? –

+0

La mala elección de la palabra, significaba respeto. –

+0

eso es mejor :) –

0

En C++, compilar constantes de tiempo se puede utilizar como longitudes en las declaraciones de matriz y const las variables (sólo algunos de ellos) puede ser de compilación tiempo constantes. Es por eso que funcionará en C++.

C, sin embargo, tiene una función que se ve similar, la matriz de longitud variable. Significa que puede usar cualquier expresión entera (incluso el tiempo de ejecución calculado) como longitud de matriz, pero solo para variables locales. Esta es la razón por la que su compilador se queja de "X1 'modificado de forma variable en el alcance del archivo".

0

Como ya han dicho otros C y C++ son diferentes con respecto a las expresiones enteras constantes.

Pero no es necesario utilizar una macro, ya que otros sugirieron tener un código que funcione con ambos. Si desea hacerlo con "alcance", puede hacerlo con una constante de enumeración.Algo así como

enum { num = 16 }; 
struct inputs { 
    double X1[num]; 
    double X2[num]; 
}; 

funcionará para ambos, independientemente de si lo pone en el alcance del archivo o la función.