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 quetype
esa
, 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
type
token (que se convierte ena
) con el_value
token. 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();