En el siguiente código, ¿qué hace el ##
?¿Qué significa un doble hash (##) en una macro?
#define MAKE_TYPE(myname) \
typedef int myname ## Id; \
En el siguiente código, ¿qué hace el ##
?¿Qué significa un doble hash (##) en una macro?
#define MAKE_TYPE(myname) \
typedef int myname ## Id; \
La ##
en una macro es concatenación. Aquí, MAKE_TYPE(test)
se expandirá a: typedef int testId
.
De 16.3.3 (El operador ##):
Por tanto objeto similar y función similares a las invocaciones macro, antes de la lista reemplazo se volvió a examinar para más nombres de macros para reemplazar, cada instancia de un ## preprocesamiento contador en la lista de reemplazo (no de un argumento ) se elimina y el precedente contador preprocesamiento se concatena con la siguiente preprocesamiento contador
I subraya la * antes de la la lista de reemplazo es reexaminada *. Si escribe 'MAKE_TYPE (OBJECT (Foo))', entonces tendrá 'typedef int OBJECT (Foo) Id;' ... que obviamente no es válido. Tratar con macros es ... complicado, y es mejor evitarlo especialmente para casos tan triviales donde solo ofusca las cosas. –
icecrime es correcto, pero algo importante para señalar en la definición es que los tokens deben ser tokens de preprocesamiento válidos. Ejemplos:
#define CONCAT(a,b) a ## b
CONCAT(ClassyClass, <int>); // bad, <int> is not a valid preprocessing token
CONCAT(Symbol, __LINE__); // valid as both are valid tokens
Eso me causó una gran frustración hace varios años, ya que quería concatenar tres cosas juntas, y la combinación de ni el primero ni el último par eran tokens de preprocesamiento válidos. –
Gran punto, pero no una respuesta. Debería haber sido un comentario para Icecrime's. –
Esencialmente un duplicado de [SO 1489932 C preprocesador y Concatenación] (http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation/) –