2010-09-30 27 views
8
// sizeofarray.cpp 
#include <iostream> 
template <typename T,int N> 
int size(T (&Array)[N]) 
{ 
    return N; 
} 

int main() 
{ 
    char p[]="Je suis trop bon, et vous?"; 
    char q[size(p)]; // (A) 
    return 0; 
} 

Escuché que un tamaño de matriz en C++ debe ser una expresión constante. Entonces, char q[size(p)] no es válido, ¿estoy en lo cierto? Pero no recibí ningún error cuando probéUsar el tamaño de una matriz en otra matriz

g++ -Wall sizeofarray.cpp 

¿Por qué?

+2

'q [sizeof (p)]' está bien, probablemente quiso decir 'q [tamaño (p)]'. Tenga en cuenta que este último será válido en C++ 0x (si declara 'size' como' constexpr'). – avakar

+0

El problema es con el 'tamaño' en lugar de sizeof. Ver mi publicación. – Chubsdad

+1

Pruebe las opciones del compilador -pedantic o -std = C++ 98 ;-) – sellibitze

Respuesta

4

Escuché que un tamaño de matriz en C++ debe ser una expresión constante.

correcta

Así carbón q [tamaño (p)] no es válido, ¿verdad?

Según ISO C++, sí!

pero me dio ningún error cuando intenté

g ++ -Wall sizeofarray.cpp

Eso es porque g ++ soporta VLA (Variable Length Array) como una extensión.

En C++0x hay constexpr función con la ayuda de los cuales puede escribir

constexpr int size(T (&Array)[N]) 
{ 
    return N; 
} 

y luego char q[size(p)] sería legal.

EDITAR: Lea también this artículo [el blog lo que sea]

+1

seguramente sizeof es una expresión constante (al menos para un no-vla que el estándar C++ ni siquiera tiene)? – nos

+0

@nos: yes :) .. –

+1

+1. En el último ejemplo, 'sizeof' debe ser' size'. – sellibitze

7

Como Prasoon says, no es una expresión constante. Por ahora, se puede obtener un valor constante-expresión del tamaño de una matriz de esta manera:

template <std::size_t N> 
struct type_of_size 
{ 
    typedef char type[N]; 
}; 

template <typename T, std::size_t Size> 
typename type_of_size<Size>::type& sizeof_array_helper(T(&)[Size]); 

#define sizeof_array(pArray) sizeof(sizeof_array_helper(pArray)) 

Explicación here. Es, básicamente, codificar el tamaño de la matriz en el tamaño de un tipo, a continuación, obtener la sizeof de ese tipo, que le da:

char q[sizeof_array(p)]; 
+0

Cute hack ':)', +1. –

-1

No estoy de acuerdo con todas las respuestas aquí. El espectáculo código es perfectamente bien, excepto por un problema menor (que definitivamente no es VLA)

template <typename T,int N> 
int size(T (&Array)[N]) 
{ 
    return N; 
} 

int main() 
{ 
    char p[]="Je suis trop bon, et vous?"; 
    char q[sizeof(p)]; // (A), not sizeof and not size as in OP 
    return 0; 
} 

Me preguntaba que el resultado de la sizeof es siempre un valor constante, y por lo tanto el código debería estar bien.

El código anterior se basa bien en VS 2010 y Comeau (modo estricto)

$ 5.3.3/6- "El resultado es una constante de tipo size_t [Nota:. Size_t se define en el encabezado estándar (18.1). "

+2

Creo que probablemente quiso decir 'char q [tamaño (p)]'. He hecho las correcciones necesarias en el OP. –

-1

Uso g ++ 4.4.3 y tienen los siguientes alias para que nunca te olvides de encender las advertencias:

$ alias g++ 
alias g++='g++ -ansi -pedantic -Wall -W -Wconversion -Wshadow -Wcast-qual -Wwrite-strings' 

Si compilado con lo anterior, habría algunas advertencias. Los siguientes pasos muestran cómo las diferentes opciones muestran diferentes advertencias.

Compilación sin opción de advertencia no se muestra ninguna advertencia

$ \g++ sizeofarray.cpp 

Encendido -Wall

$ \g++ -Wall sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’: 
sizeofarray.cpp:12: warning: unused variable ‘q’ 

Encendido -Wextra

$ \g++ -Wall -Wextra sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’: 
sizeofarray.cpp:12: warning: unused variable ‘q’ 
sizeofarray.cpp: At global scope: 
sizeofarray.cpp: In instantiation of ‘int size(T (&)[N]) [with T = char, int N = 27]’: 
sizeofarray.cpp:12: instantiated from here 
sizeofarray.cpp:4: warning: unused parameter ‘Array’ 

Finalmente encender -pedantic para coger el verdadero problema

$ \g++ -Wall -Wextra -pedantic sizeofarray.cpp 
sizeofarray.cpp: In function ‘int main()’: 
sizeofarray.cpp:12: warning: ISO C++ forbids variable length array ‘q’ 
sizeofarray.cpp:12: warning: unused variable ‘q’ 
sizeofarray.cpp: At global scope: 
sizeofarray.cpp: In instantiation of ‘int size(T (&)[N]) [with T = char, int N = 27]’: 
sizeofarray.cpp:12: instantiated from here 
sizeofarray.cpp:4: warning: unused parameter ‘Array’ 
Cuestiones relacionadas