Matriz modificada de forma variable en el scope del archivo

¿Qué pasa con el siguiente código?

 # define DELAY_CYCLES ((int) (0.1 / 0.001))
 typedef struct {
     doble estado_historia [N_X] [DELAY_CYCLES];
     doble foo
 foo

gcc se queja:

main.h: 52: 3: advertencia: ‘state_history’ modificado de forma variable en el scope del archivo

¿Es porque el int cast no se puede hacer en tiempo de comstackción por alguna razón?

EDITAR DE NUEVO

Si sigue el estándar de la letra, entonces sí, debe evitar las expresiones de punto flotante allí. En C, con la única excepción de las constantes de punto flotante convertidas en enteros (como (int)3.0f ), las expresiones de punto flotante no se consideran expresiones de constantes enteras en tiempo de comstackción para los cálculos de tamaño de matriz. Debe modificar la definición para evitar los números de punto flotante y usar números enteros exclusivamente.

Para no ser una matriz de longitud variable, se requiere que los tamaños de matriz sean “expresiones constantes de enteros” (C99 §6.7.5.2 / 4), y se define una “expresión constante de enteros” en §6.6 / 6 (énfasis mío):

Una expresión constante de enteros 96) tendrá un tipo de enteros y solo tendrá operandos que sean constantes de enteros, constantes de enumeración, constantes de caracteres, expresiones de sizeof cuyos resultados sean constantes de enteros y constantes flotantes que son los operandos inmediatos de los moldes . Los operadores de conversión en una expresión constante de entero solo convertirán los tipos aritméticos en tipos enteros, excepto como parte de un operando al operador sizeof .

Parece que GCC solo agregó esa advertencia en la versión 4.5. En 4.4 y más abajo, no informa ninguna advertencia para ese código, incluso con -Wall -Wextra -ansi -pedantic . Sin embargo, para estar seguro y 100% portátil, debe cambiar la definición de DELAY_CYCLES para evitar expresiones de punto flotante.

Incluso si fuera una expresión constante entera, (int)(0.1/0.001) podría ser fácilmente 99 o 100, ya que los valores 0.1 y 0.001 no existen en el punto flotante. Determinar qué valor especifica IEEE 754 requeriría verificar ambos valores de 0.1 y 0.001 para ver si están más cerca de sus vecinos de arriba o de abajo, luego hacer la división de esos vecinos, o simplemente verificarlo en un sistema conforme. Sin embargo, este es un lugar donde no me gustaría confiar en que la implementación sea conforme para obtener la respuesta correcta.