El tipo de dato complejo “typedef” en C genera un error de compilación en el compilador IAR, pero funciona en GCC y ARMCC.
Tengo un código en C para un microcontrolador basado en ARM que ya se compila con GCC y el compilador de ARM. Sin embargo, al compilarlo con IAR V8.42.1, hay un problema con lo siguiente:
typedef float _Complex f_complex;
El mensaje de error es:
esperaba un ";"
y la flecha apunta hacia la “f” en f_complex
.
He leído sobre el uso de tipos complejos en C y este tipo de typedef
parece ser bastante típico. También revisé el manual del compilador IAR y C99 es el estándar de C por defecto, lo que significa que complex.h
debería funcionar de inmediato. Ninguna de las banderas del compilador enumeradas en el manual parece que puedan afectar esto, excepto por --c89
, pero eso no es lo predeterminado en ningún caso y estoy utilizando el compilador con su configuración predeterminada, la variable CFLAGS
en mi Makefile
está vacía.
Es interesante que si modifico el typedef
original de la siguiente manera:
typedef _Fcomplex f_complex;
donde _Fcomplex
está typedef
en complex.h
como:
typedef float _Complex _Fcomplex;
se compila perfectamente. Si bien esta versión funciona, la typedef
del encabezado es idéntica a la anterior, excepto por el nombre del tipo.
¿Alguien sabe cuál podría ser el problema aquí?
davy.ai
Problema con el compilador IAR y typedef para
float _Complex
Problema
El código
typedef float _Complex f_complex;
se compila con GCC y el compilador ARM pero no se compila con IAR V8.42.1. El mensaje de error muestrase esperaba ";"
señalando la “f” enf_complex
.Intentos de solución
El uso de tipos complejos en C es bastante común, y la implementación del código
typedef
parece ser típica. Según el manual del compilador IAR, C99 es el estándar de C predeterminado ycomplex.h
debería funcionar sin problemas. Ninguna de las banderas del compilador parece ser responsable del problema, incluyendo--c89
. La variableCFLAGS
delMakefile
también está vacía, lo que indica que el compilador está utilizando su configuración predeterminada.Si se modifica el
typedef
original de la siguiente manera:donde
_Fcomplex
estátypedef
ado encomplex.h
como:se compila sin errores. Tenga en cuenta que la versión modificada es casi idéntica a la implementación original, excepto por el nombre del tipo.
Solución
La solución al problema es reemplazar
float _Complex
por_Fcomplex
en la declaración del typedef. Parece que el compilador IAR no reconocefloat _Complex
como un tipo válido, pero usar_Fcomplex
funciona sin problemas.