Recibo un error en la línea 6 (inicializar my_foo en foo_init) del siguiente programa y no estoy seguro de entender por qué.
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 de objeto, que múltiples archivos podrían usar para inicializar una estructura de estado. Como es un objetivo incrustado con recursos limitados y la estructura no es tan pequeña, no quiero varias copias de la fuente. Prefiero no usar:
#define foo_init { 1, 2, 3 }
También estoy tratando de escribir código portátil, 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? ¿Que 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í?
fuente
enum { N = 5 };
es una forma poco apreciada de declarar constantes sin tener que recurrir a ellas#define
.static int* ptr = malloc(sizeof(int)*5);
pero NO es un errorstatic int* ptr; ptr = malloc(sizeof(int)*5);
:: DEs una limitación del idioma. En la sección 6.7.8 / 4:
En la sección 6.6, la especificación define lo que debe considerarse una expresión constante. En ningún lugar indica que una variable constante debe considerarse una expresión constante. Es legal que un compilador extienda esto (
6.6/10 - An implementation may accept other forms of constant expressions
) pero eso limitaría la portabilidad.Si puede cambiar
my_foo
para que no tenga almacenamiento estático, estaría bien:fuente
static const int x = 3; static int y = x;
.Solo para ilustración mediante comparación y contraste El código es de http://www.geeksforgeeks.org/g-fact-80/ / El código falla en gcc y pasa en g ++ /
fuente
Esto es un poco viejo, pero me encontré con un problema similar. Puede hacer esto si usa un puntero:
fuente
gcc 7.4.0 no puede compilar códigos de la siguiente manera:
constchar.c: 3: 21: error: el elemento inicializador no es constante const char * str2 = str1;
De hecho, una cadena "const char *" no es una constante de tiempo de compilación, por lo que no puede ser un inicializador. Pero una cadena "const char * const" es una constante de tiempo de compilación, debería ser un inicializador. Creo que este es un pequeño inconveniente de CLang.
El nombre de una función es, por supuesto, una constante de tiempo de compilación, por lo que este código funciona:
fuente
str1
no es una expresión según 6.7.9 Inicialización , párrafo 4 : "Todas las expresiones en un inicializador para un objeto que tiene una duración de almacenamiento estático o de subproceso serán expresiones constantes o literales de cadena".