Macros V / S funciones en línea durante la programación para avr-gcc

6

He estado haciendo mi primer trabajo serio de programación en estos días. He estado expuesto a un montón de código por diferentes desarrolladores. Una cosa que me parece confusa es cómo estos desarrolladores deciden cuándo usar una definición de macro y cuándo usar una función en línea. Ambos tienen esencialmente la misma función, colocan un determinado código en el lugar desde el que se les llama. Entonces, ¿hay alguna lógica para la selección o es solo por capricho del desarrollador?

(Estoy hablando de macros para funciones y no para constantes).

    
pregunta Rick_2047

2 respuestas

9

Las funciones en línea tienen muchas ventajas sobre las macros del preprocesador:

  • Comprobación de tipo . El compilador se quejará si los argumentos son de tipo incorrecto.
  • Sin riesgo de evaluación múltiple : las macros pueden ser peligrosas cuando el argumento es una expresión, considere:

    #include <stdio.h>
    #define square(n) ((n)*(n))
    
    int main(void)
    {
        int x, i = 0;
        while (i < 10) {
            x = square(i++);
            printf("%d\r\n", x);
        }
        return 0;
    }
    
  • Puede incluir varias líneas de código sin interrumpir las reacciones.
  • Las funciones en línea tienen su ámbito propio para las variables y pueden devolver un valor .

Las macros pueden ser útiles, por ejemplo. al concatenar tokens en código, a fin de simplificar algunas declaraciones complejas.

Considere las macros como una simple función de reemplazo de texto. Una buena regla general es evitar las macros similares a funciones, a menos que no haya otra solución viable .

Es un error común pensar que la inscripción siempre es igual a un código más rápido. Tenga en cuenta que cada llamada en línea desde más de un lugar se suma al tamaño del código . Optimización prematura no es una virtud, incluso cuando se trabaja con los recursos limitados de un microcontrolador.

GCC interpreta la palabra clave inline como una simple sugerencia. No hay garantía de que la función esté realmente en línea. Para que GCC integre su función independientemente del nivel de optimización, declare la función con el atributo always_inline :

void function() __attribute__((always_inline));
    
respondido por el mizo
6

Las funciones en línea pueden o no estar en línea por el compilador. Las macros, por otro lado, son manejadas por el precompilador, y por lo tanto se garantiza que están en línea (código replicado). A menudo, uno usará una macro para una operación corta pero compleja para agregar legibilidad al código, sin tomar una penalización de rendimiento para una llamada de función. Por ejemplo:

#define SWAP(a,b)({a ^= b; b ^= a; a ^= b;})

... proporciona una forma de intercambiar las variables a y b sin una llamada de función y sin una variable temporal.

Hay una stackoverflow question con el mismo efecto (aunque no específicamente sobre avr- gcc).

    
respondido por el vicatcu

Lea otras preguntas en las etiquetas