es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

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í?

Tags:  , ,

Answer

  1. Avatar for 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 muestra se esperaba ";" señalando la “f” en f_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 y complex.h debería funcionar sin problemas. Ninguna de las banderas del compilador parece ser responsable del problema, incluyendo --c89. La variable CFLAGS del Makefile 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:

    typedef _Fcomplex f_complex;
    

    donde _Fcomplex está typedefado en complex.h como:

    typedef float       _Complex _Fcomplex;
    

    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 reconoce float _Complex como un tipo válido, pero usar _Fcomplex funciona sin problemas.

    typedef _Fcomplex f_complex;
    

Comments are closed.