tipos sintaxis programa funciones ejemplos datos comandos codigos basicos c++ c++11 macros

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 el type , ya que type es a , 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 en a ) con el _value token. Esto da un a_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();