Aparece un error en la línea 6 (inicializo my_foo a foo_init) del siguiente programa y no estoy seguro de entender por qué.Error "el elemento inicializador no es constante" al intentar inicializar la variable con const
typedef struct foo_t {
int a, b, c;
} foo_t;
const foo_t foo_init = { 1, 2, 3 };
foo_t my_foo = foo_init;
int main()
{
return 0;
}
Tenga en cuenta que esta es una versión simplificada de un proyecto de varios archivos más grande en el que estoy trabajando. El objetivo era tener una sola constante en el archivo objeto, que varios archivos podrían usar para inicializar una estructura de estado. Dado que se trata de un objetivo incrustado con recursos limitados y la estructura no es tan pequeña, no quiero copias múltiples de la fuente. Yo prefiero no utilizar:
#define foo_init { 1, 2, 3 }
También estoy tratando de escribir código portable, así que necesito una solución que sea válida C89 o C99.
¿Tiene esto que ver con los ORG en un archivo de objeto? ¿Las variables inicializadas entran en un ORG y se inicializan copiando el contenido de un segundo ORG?
Tal vez solo necesite cambiar mi táctica y tener una función de inicialización para hacer todas las copias al inicio. A menos que haya otras ideas por ahí?
+5 por la buena explicación, pero sorprendentemente este programa compila bien en ideone: http://ideone.com/lx4Xed. ¿Es un error del compilador o una extensión del compilador? Gracias – Destructor
@meet: No sé qué combinación de opciones de compilación ideone utiliza bajo el capó, pero sus resultados a menudo son extraños más allá de la descripción. Traté de compilar este código en Coliru (http://coliru.stacked-crooked.com/a/daae3ce4035f5c8b) y obtuve el error esperado, independientemente de la configuración del dialecto del lenguaje C que use. No veo nada de eso listado en el sitio web de GCC como extensión de lenguaje C. En otras palabras, no tengo idea de cómo y por qué se compila en ideone. Incluso si se compila como una extensión de idioma, aún debería generar un mensaje de diagnóstico en C. – AnT
'enum {N = 5};' es una forma poco apreciada de declarar constantes sin tener que recurrir a '# define'. –