Compartir a través de


Directiva #define (C/C++)

#define crea una macro, que es la asociación de un identificador o ID con parámetros con una cadena de token.Después de que la macro está definido, el compilador puede sustituir la cadena de token para cada aparición del identificador del archivo de código fuente.

Sintaxis

#defineidentificadorsímbolo-cadenaopt

#defineidentificador(identificadoropt,…,identificadoropt)símbolo-cadenaopt

Comentarios

La directiva de #define hace que el compilador para sustituir símbolo-cadena para cada aparición de identificador en el archivo de código fuente.Se reemplaza identificador cuando forma un símbolo.es decir, identificador no se reemplaza si aparece en un comentario, en una cadena, o como parte de un identificador más largo.Para obtener más información, vea Tokens de C++.

El argumento de símbolo-cadena consiste en una serie de tokens, como palabras clave, constantes, o instrucciones completas.Uno o más caracteres de espacio en blanco deben separarse símbolo-cadena de identificador.Este espacio en blanco no se considera parte de texto sustituido, ni es cualquier espacio en blanco que siga el símbolo último de texto.

#define sin símbolo-cadena quita apariciones de identificador del archivo de código fuente.identificador permanece definido y se puede probar con las directivas de #if defined y de #ifdef .

El segundo formato de sintaxis define a función-como macro con parámetros.Este formulario acepta una lista opcional de parámetros que deben aparecer entre paréntesis.Después de que la macro está definido, cada repetición posterior de identificador( identificadoropt,…, identificadoropt ) se reemplaza con una versión del argumento de símbolo-cadena que tiene argumentos reemplazados por los parámetros formales.

Los nombres de parámetros formales aparecen en símbolo-cadena para marcar las ubicaciones donde se sustituyen los valores reales.Cada nombre de parámetro puede aparecer varias veces en símbolo-cadena, y los nombres pueden aparecer en cualquier orden.El número de argumentos de la llamada debe coincidir con el número de parámetros en la definición de macro.El uso racional de paréntesis garantiza que los argumentos complejos se interpretan correctamente.

Los parámetros formales de la lista están separados por comas.cada nombre en la lista debe ser único, y la lista se debe agregar entre paréntesis.Espacios pueden separar identificador y paréntesis de apertura.Utilice la concatenación de línea — colocar una barra diagonal inversa (\) inmediatamente antes del carácter de nueva línea — para las directivas largas en líneas de código fuente.El ámbito de un nombre de parámetro formal extiende a la nueva línea que finaliza símbolo-cadena.

Cuando una macro ha sido definidas en el segundo formato de sintaxis, las instancias textuales subsiguientes seguidas de una lista de argumentos indican una macro-instrucción.Los argumentos que sigue a una instancia de identificador en el archivo de código fuente coinciden con los parámetros formales correspondientes en la definición de macro.Cada parámetro formal en símbolo-cadena que no va precedido por de generación de cadenas (#), charizing (#@), o el operador) en lugar de##), ni va seguido de un operador de ## , se reemplaza por el argumento real correspondiente.Cualquier macro en el argumento real se expanda antes de que la directiva reemplace el parámetro formal.(Se describen los operadores de Operadores de preprocesador.)

Los siguientes ejemplos de macros con argumentos muestran el segundo formato de sintaxis de #define :

// Macro to define cursor lines 
#define CURSOR(top, bottom) (((top) << 8) | (bottom))

// Macro to get a random integer with a specified range 
#define getrandom(min, max) \
    ((rand()%(int)(((max) + 1)-(min)))+ (min))

Los argumentos con efectos secundarios deben a veces macros a resultados inesperados de producción.Un parámetro formal determinado puede aparecer más de una vez en símbolo-cadena.si ese parámetro formal es reemplazado por una expresión con efectos secundarios, la expresión, con sus efectos secundarios, se puede evaluar más de una vez.(Vea los ejemplos en Operador) en lugar del operador.)

La directiva de #undef produce la definición de preprocesador un identificador que se olvidará.Vea La directiva #undef para obtener más información.

Si el nombre de la macro definido aparece en símbolo-cadena (incluso durante un resultado de otra extensión de macro), no se expande.

Un segundo #define para una macro con el mismo nombre genera una advertencia a menos que la segunda secuencia simbólica es idéntica a la primera.

Específicos de Microsoft

Microsoft C/C++ permite volver a definir una macro si la nueva definición es sintácticamente idéntica a la definición original.Es decir las dos definiciones pueden tener distintos nombres de parámetro.Este comportamiento difiere de ANSI C, que requiere que las dos definiciones son léxicamente idénticas.

Por ejemplo, las dos macros siguientes son idénticas salvo los nombres de parámetro.ANSI C no permite esa redefinición, pero las compilaciones de Microsoft C/C++ él sin errores.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( a1 * a2 )

Por otra parte, las dos macros siguientes no son idénticas y generará una advertencia en Microsoft C/C++.

#define multiply( f1, f2 ) ( f1 * f2 )
#define multiply( a1, a2 ) ( b1 * b2 )

Específico de Microsoft de FINAL

este ejemplo muestra la directiva de #define :

#define WIDTH       80
#define LENGTH      ( WIDTH + 10 )

la primera instrucción define el identificador WIDTH como la constante entera 80 y define LENGTH en términos de WIDTH y constante entera 10.Cada aparición de LENGTH se reemplaza por (WIDTH + 10).A su vez, cada aparición de WIDTH + 10 se reemplaza por la expresión (80 + 10).Los paréntesis alrededor de WIDTH + 10 son importantes porque controlan la interpretación en instrucciones como el siguiente:

var = LENGTH * 20;

Después de la fase de preprocesamiento la instrucción se convierte en:

var = ( 80 + 10 ) * 20;

qué se evalúa como 1800.sin paréntesis, el resultado es:

var = 80 + 10 * 20;

qué se evalúa como 280.

Específicos de Microsoft

La definición de macros y de constantes con la opción del compilador /D tiene el mismo efecto que mediante #define que preprocesa directiva al principio del archivo.Hasta 30 macros pueden definirse mediante la opción /D.

Específico de Microsoft de FINAL

Vea también

Referencia

Directivas de preprocesador