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.

Preprocesador en el lenguaje C

Me gustaría definir una variable (Mode) para elegir entre dos funciones, pero el compilador no parece hacer lo que quiero, aquí está el código:

#include <stdio.h>

#define Mode dif

#if Mode == sum
int function(int a, int b)
{
    return a+b;
}
#elif Mode == dif
int function(int a, int b)
{
    return a-b;
}
#else
ERROR
#endif

int main()
{
    printf("%d", function(5,3));

    return 0;
}

El compilador elige la función “sum” (o la primera que escribí) para cualquier valor de cadena (o un entero 0) que coloco en “Mode”, y elige el estado “ERROR” para cualquier otro entero que coloco además de 0, eso es lo que he observado hasta ahora.

Puedo hacer que funcione cambiando “sum” y “dif” con números, pero estoy trabajando en otro proyecto electrónico en el que tengo que usar palabras en lugar de números, de lo contrario será difícil de implementar y diagnosticar, por ejemplo:

#define Falling_Edge 0x00
#define Rising_Edge  0x01
#define Both         0x02
#define IT_Mode X // X podría ser Falling_Edge, Rising_Edge o Both

if (IT_Mode == Falling_Edge)
{
    // hacer algo
}
else if (IT_Mode == Rising_Edge)
{
    // hacer algo
}
else if (IT_Mode == Both)
{
    // hacer algo
}
else
{
    ERROR
}

¿Hay alguna manera de lograr algo así en C por favor?

Gracias.</stdio.h>

Tags:  ,

Answer

  1. Avatar for davy.ai

    Para definir una variable para elegir entre dos funciones en C utilizando el preprocesador, puede modificar el código de la siguiente manera:

    #include <stdio.h>
    
    #define Modo dif
    
    int sumar(int a, int b)
    {
        return a+b;
    }
    
    int dif(int a, int b)
    {
        return a-b;
    }
    
    #define funcion(a,b) Modo(a,b)
    
    int main()
    {
        printf("%d",funcion(5,3));
    
        return 0;
    }
    

    En este código modificado, definimos dos funciones separadas para sumar y dif. Luego usamos una nueva macro llamada funcion para elegir qué función utilizar según el valor de la macro Modo. Esto nos permite elegir entre dos funciones basadas en un solo valor definido en tiempo de compilación.

    Para ampliar este enfoque y usar palabras en lugar de números, puede definir constantes de cadena para los nombres de las funciones y utilizar una serie de declaraciones if para elegir la función apropiada. Por ejemplo:

    #include <stdio.h>
    #include <string.h>
    
    #define Flanco_Descendente 0
    #define Flanco_Ascendente  1
    #define Ambos         2
    #define Modo_IT      "Flanco_Ascendente"
    
    int flanco_descendente(int entrada)
    {
        return entrada == 0;
    }
    
    int flanco_ascendente(int entrada)
    {
        return entrada == 1;
    }
    
    int ambos(int entrada)
    {
        return 1;
    }
    
    int main()
    {
        int resultado = 0;
        if (strcmp(Modo_IT, "Flanco_Descendente") == 0)
        {
            resultado = flanco_descendente(1);
        }
        else if (strcmp(Modo_IT, "Flanco_Ascendente") == 0)
        {
            resultado = flanco_ascendente(1);
        }
        else if (strcmp(Modo_IT, "Ambos") == 0)
        {
            resultado = ambos(1);
        }
        else
        {
            printf("ERROR");
            return 1;
        }
    
        printf("%d", resultado);
    
        return 0;
    }
    

    En este código modificado, definimos funciones basadas en cada uno de los valores posibles de Modo_IT. Luego usamos una serie de declaraciones if para elegir la función apropiada según el valor de la constante de cadena Modo_IT. Este enfoque nos permite elegir entre múltiples funciones según una constante de cadena definida en tiempo de compilación.
    Nota que utilizamos la función strcmp() para comparar los valores de las cadenas en lugar del operador ==, ya que el operador == no funciona con literales de cadena.</string.h></stdio.h></stdio.h>

Comments are closed.