2010-09-15 8 views
8

Tengo un código C que debo transferir a C++. El código tiene una estructura¿Declaraciones a futuro para variables?

struct A { 
    ... 
    struct A * myPtr; 
} 

Y ahora dos matrices globales se declaran e inicializan como esto:

//Forward declaration of Unit 
struct A Unit[10]; 

struct A* ptrUnit[2] = { Unit, Unit+7 }; 
struct A Unit[10] = { { .., &ptrUnit[0] }, 
         ... }; 

Ahora bien, aunque esto funciona bien en C, que da un error en C++ (variable redeclarada). ¿No se permite que las variables sean declaradas hacia adelante en C++?

Respuesta

18

En C++, una variable declaración debe tener el prefijo extern:

extern A Unit[10]; 

// ... 

A Unit[10] = { ... }; 

(. Tenga en cuenta que en C++ se puede omitir el líder struct)

+2

Ver [esta respuesta] (http://stackoverflow.com/questions/1410563/what-is-the-difference-between-a-definition-and-a-declaration/1410632#1410632) para obtener más detalles sobre las declaraciones y definiciones. – sbi

+2

su afirmación sobre 'el mismo espacio de nombres' no es completamente correcta. Una definición 'struct A' tiene una' implícita 'typedef struct A A' como consecuencia, si el identificador' A' no está definido en el mismo ámbito. Algo como 'struct A {...} A;' es completamente legal en C++, y luego 'A' (sin' struct') se refiere al objeto. Sin embargo, que esto sea posible no significa que este sea un buen estilo. En POSIX tienes eso, por ejemplo, con el archivo de encabezado "sys/stat.h" que define 'struct stat' y la función' stat'. –

+1

@Jens: No estoy seguro de los detalles legales de esto, pero parece que tiene sentido. Edité mi respuesta en consecuencia. – sbi

1

C allows variables para ser declaradas tenatively (I adivinar). C++ no. Una vez que se ha definido 'Unidad', no se puede redefinir en el mismo ámbito

17

struct A Unit[10] no es una declaración directa de una variable. El término "declaración directa" normalmente se refiere a declaraciones no definidas, mientras que struct A Unit[10] es una definición . Por lo tanto, en su código está definiendo Unit varias veces en el mismo archivo fuente. En lenguaje C, está permitido, ya que en C las definiciones sin inicializador son definiciones tentativas. Pueden ocurrir muchas veces en la misma unidad de traducción. En C++ no existe la definición tentativa. En C++ las definiciones múltiples son siempre ilegales.

Si quieres una auténtica declaración adelantada para una variable, usted tiene que utilizar la palabra clave extern

extern struct A Unit[10]; 

Esto funciona tanto en C y C++. Sin embargo, como efecto secundario, esto dará Unitexternal vinculación. Si necesita una variable con enlace interno, entonces no tiene suerte en C++, ya que en C++ no es posible reenviar-declarar una variable con enlace interno. Mientras tanto, en C las definiciones provisionales te ayudarán a lograr eso.

+0

+1, respuesta bien puesta – sellibitze

Cuestiones relacionadas