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.

C Macro obtiene el valor del token en lugar del nombre del token.

Por favor, vea el fragmento de código, en c, a continuación y observe los comentarios. ¿Hay alguna forma de hacer esto posible? ¿El preprocesador ya sabe que spn1 = 18? ¿Hay alguna forma de usar el valor de spn1 como nombre de token?

#define TEST_M(_spn) struct astruct _test_struct_##_spn = { .spn = _spn, };

enum spns {
    spn_1 = 18,
};

struct astruct {
    int spn;
};

TEST_M(spn_1)

// Lo que quiero:
// struct astruct _test_struct_18 = { .spn = 18, };
// Lo que obtengo:
// struct astruct _test_struct_spn_1 = { .spn = 18, };
// Puedo hacerlo, pero quiero asociar un nombre a 18:
// TEST_M(18)
Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Sí, es posible usar el valor de spn_1 como nombre de token. Una forma de lograr esto es utilizar el operador de concatenación ‘##’ en la definición de la macro, como se muestra a continuación:

    #define TEST_M(_spn) struct astruct _test_struct_##_spn = { .spn = _spn, };
    
    enum spns {
        spn_1 = 18,
    };
    
    struct astruct {
        int spn;
    };
    
    TEST_M(spn_1)
    TEST_M(18) // utilizando el valor de spn_1 como nombre de token
    

    Esto creará una estructura con el nombre _test_struct_18 e inicializará su miembro spn con el valor 18.

    El preprocesador no sabe que spn_1 = 18. Simplemente reemplaza el parámetro de la macro spn con su valor (es decir, spn_1) donde aparezca en la definición de la macro. Mediante el operador de concatenación ‘##’ podemos combinar el prefijo “_test_struct” con el valor de _spn para crear un nombre de variable válido.

Comments are closed.