2010-11-19 21 views
12

En el siguiente código, ¿qué hace el ##?¿Qué significa un doble hash (##) en una macro?

#define MAKE_TYPE(myname) \ 
typedef int myname ## Id; \ 
+0

Esencialmente un duplicado de [SO 1489932 C preprocesador y Concatenación] (http://stackoverflow.com/questions/1489932/c-preprocessor-and-concatenation/) –

Respuesta

22

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

+4

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. –

4

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 
+1

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. –

+0

Gran punto, pero no una respuesta. Debería haber sido un comentario para Icecrime's. –

Cuestiones relacionadas