2009-03-29 16 views
11

Esta pregunta está relacionada con el sistema operativo Symbian pero creo que el veterano de C/C++ también puede ayudarme. Estoy compilando una biblioteca de código abierto para el sistema operativo Symbian. Usando un compilador de GCCE compila sin errores (después de algunas modificaciones :)). I cambiado compilador para ARMv5 y ahora tengo varios errores con las definiciones de estructuras const estáticos, por ejemplo: que tienen una estructura:definiendo estructuras estáticas

typedef struct Foos{ 
    int a; 
    int b; 
} Foos; 

Y la siguiente definición de una estructura const de tipo Foos

static const Foos foo = { 
    .a = 1, 
    .b = 2, 
}; 

GCCE no tiene ningún problema con esto y ARMV5 dice "esperaba una expresión" en ".a = 1, .b = 2". Por lo que busqué en Google con respecto a esto, creo que este método debería ser legal en C pero ilegal en C++, si ese es el caso, ¿cuáles son las posibilidades para declarar estructuras en C++? Si ese no es el caso, se apreciará cualquier otra ayuda.

Gracias de antemano :)

Respuesta

13
static const struct Foos foo = { 1, 2 }; 

Compila tanto con g ++ y gcc.

Usted podría por supuesto, como OneByOne señala, definir un constructor:

typedef struct Foos { 
    int a; 
    int b; 
    Foos(int a, int b) : a(a), b(b) {} 
}; 

Qué le inicializar este modo: la notación de estilo

static const struct Foos foo(1, 2); 
+0

Gracias! Eliminar los nombres de campo funcionó. – dudico

4

El punto es que creo válido en ANSI C99. No es válido es ANSI C89. Casi todos los compiladores C no han implementado C99.

+1

gcc admite la notación de estilo de punto sin opciones de línea de comando. ¿Hay otros compiladores de C? : O –

+0

Tristemente, sí. MSVC, que tiene AFAIK congelado su soporte C. –

5

Eso es legal C99, pero no es legal C89 o C++. Presumiblemente, está compilando esto como C++, por lo que si utiliza las opciones del compilador para hacer cumplir las normas, entonces GCCE también lo rechazará.

Puede hacer foo = {1, 2}; en C o C++. Obviamente, usted pierde el beneficio de que los nombres de los campos estén ahí: tiene que confiar en que la orden sea correcta.

Otra buena opción en C++ es definir un constructor para su estructura e inicializar con static const Foos foo(1,2);. Sin embargo, esto impide que la estructura sea POD, por lo que no puede hacer las mismas suposiciones sobre su representación en la memoria.

5

Solo una nota de que writable static data no es compatible con las DLL en algunas versiones de Symbian. Es posible que no afecte a lo que está haciendo, ya que sus ejemplos son const o puede que solo sea compatible con Symbian v8.1bo posterior.

Pensé que lo señalaría ya que una vez me caí en esa trampa.

Presupuesto de funciones del foro:

Soporte para el mundial grabables datos estáticos en el sistema operativo Symbian

Symbian OS es compatible con grabable mundial datos estáticos en exe en todas las versiones y teléfonos.

Versiones del SO Symbian basadas en el kernel EKA2 (8.1b y posterior) admite WSD en DLL en el hardware de destino. Las versiones 8.1ay anteriores, basadas en kernel EKA1, no son compatibles con WSD global en DLL.

+0

Sí, conozco el límite de datos estáticos en el sistema operativo anterior a 8.1, estoy usando la biblioteca para 9.1 y posterior. ¡Gracias por hacer esa nota importante de todos modos! – dudico

Cuestiones relacionadas