2010-11-22 16 views
25

¿Hay alguna razón para preferir¿Cuál es la diferencia entre una macro preprocesador sin argumentos, y uno con cero argumentos

#define MY_MACRO() ..stuff.. 

a

#define MY_MACRO ..stuff.. 

No utilice macros no es válida respuesta ...

+2

Desde que agregó la etiqueta C++ que no usa macros es una respuesta válida. Si solo quiere hablar sobre el preprocesador, simplemente márquelo como preprocesador y no como C++ –

+12

@Martin: el preprocesador es una parte tan importante de C++ como lo es el STL; ¿Las preguntas sobre el STL deben etiquetarse '[stl]' y no '[C++]' también? Es cierto que las macros no deberían usarse la mayor parte del tiempo en C++, pero a veces pueden ser extraordinariamente útiles. –

+4

@James McNellis: ¡De hecho, sería prácticamente imposible implementar las bibliotecas de Boost sin macros! –

Respuesta

16

La sustitución solo se produce para una macro de tipo función si el nombre de la macro va seguido de un paréntesis izquierdo. Por lo tanto, el siguiente toda invocar la función similar a la macro MY_MACRO():

MY_MACRO() 
MY_MACRO () 
MY_MACRO 
() 

pero esto no sería:

MY_MACRO SomethingElse 

Depende de cómo se está utilizando la macro y para qué se utiliza para en cuanto a si o no, esto es importante. Idealmente, sus macros tendrán todos nombres distintos; si reserva los identificadores en mayúsculas para las macros, entonces no debería importar si usa una macro similar a un objeto o una función con cero parámetros.

Estéticamente, por lo general (aunque no siempre) es más limpio no tener macros que funcionen como cero parámetros.

+0

Como señalo a continuación, si 'MY_MACRO' es, por ejemplo, completar una función que depende de las condiciones ambientales (por ejemplo, diferentes funciones para OS X y Windows), usarla sin paréntesis le permite pasar esa función a través de indicadores de función , que puede ser útil. –

+0

Entonces, de esto podría decir que las siguientes dos definiciones de macro son funcionalmente equivalentes #define MIN0() X

1

Macro (x) es preferible cuando tiene parámetros para pasar. Si usted está haciendo un simple "reemplazar" a continuación, la OMI, la preferible utilizar bla ... #define

6

Yo prefiero usar MY_MACRO(), con paréntesis, porque se siente más como si estuviera llamando a una función. De lo contrario, parece que estoy llamando a una constante:

MY_MACRO(); 

vs

MY_MACRO; 

Esto es, si la definición se utiliza para llamar a código, en lugar de un simple valor constante.

+7

Si 'MY_MACRO' es solo un contenedor para una función (una que está oculta en algún lugar presumiblemente, o necesita cambiar en función del entorno, o algo así), entonces definirla sin paréntesis le permitiría pasar esa función como una puntero de función a otras funciones, que pueden o no ser útiles. –

+0

@ChrisLutz Desde otra perspectiva, también agregará otro macro símbolo de qué preocuparse. 'struct state {int errno;/* ERROR! * /}; ' – YoYoYonnY

Cuestiones relacionadas