sintaxis - La macro ''##'' de C++ no funciona después del operador ''->''
sintaxis de c++ (3)
Tengo un objeto shared_ptr x, que tiene los métodos de obtención y configuración de la siguiente manera:
x->a_value();
x->set_a_value();
x->b_value();
x->set_b_value();
Cuando trato de definir una macro:
#define MAC(type) /
x->set_##type##_value(val);
MAC(a)
Funciona bien, pero cuando lo hago:
#define MAC(type) /
x->##type##_value();
MAC(a)
da el siguiente error de compilación: pasting formed ''->a'', an invalid preprocessing token
El operador de pegado de token ( ## ) se utiliza para concatenar dos tokens en un solo token válido .
Cuando escribes
x->##type##_value();
El primer token procesado es
x.El siguiente token se forma concatenando el token
->con eltype, ya quetypeesa, el resultado de la concatenación es->a, que debería ser un token válido, pero no lo es.
Por lo tanto, aparece el error: pasting formed ''->a'', an invalid preprocessing token .
Para arreglar esto, solo escribe
x->type##_value();
De esta manera
El primer token analizado es
x.El siguiente token analizado es
->.El siguiente token se forma concatenando el
typetoken (que se convierte ena) con el_valuetoken. Esto da una_value, que es un token válido.El siguiente token es
(.El siguiente token es
).El último token es
;.
El preprocesador funciona en "tokens", como nombres y operadores.
El operador ## crea un nuevo token pegando partes más pequeñas juntas. En el primer ejemplo, el set_##type##_value convierte en set_a_value , que es un token válido.
En el segundo ejemplo ->##type##_value se convertiría en ->a_value , que no es un token de preprocesador válido. Deben ser dos fichas.
Si acaba de hacer la línea x->type##_value(); deberia de funcionar. a_value los tokens separados x , -> , a_value , ( , ) y ; .
Lo que dice en la lata: ->a no es un solo token de preprocesador válido: es dos tokens. No necesitas pegar aquí.
#define MAC(type) /
x->type##_value();