#define (Directiva) (C/C++)#define directive (C/C++)

El #define crea una macro, que es la Asociación de un identificador o un identificador parametrizado con una cadena de token.The #define creates a macro, which is the association of an identifier or parameterized identifier with a token string. Una vez definida la macro, el compilador puede sustituir la cadena de token para cada aparición del identificador del archivo de código fuente.After the macro is defined, the compiler can substitute the token string for each occurrence of the identifier in the source file.

SyntaxSyntax

identifier token de identificador de #define: cadenaopcional #define#define identifier token-stringopt
#define identificador de #define ( identificadorOPT, ... , IdentifierOPT ) token-StringOPC#define identifier ( identifieropt, ... , identifieropt ) token-stringopt

ComentariosRemarks

La directiva #define hace que el compilador sustituya por la cadena de token para cada aparición del identificador en el archivo de código fuente.The #define directive causes the compiler to substitute token-string for each occurrence of identifier in the source file. El identificador solo se reemplaza cuando forma un token.The identifier is replaced only when it forms a token. Es decir, el identificador no se reemplaza si aparece en un comentario, en una cadena o como parte de un identificador más largo.That is, identifier is not replaced if it appears in a comment, in a string, or as part of a longer identifier. Para obtener más información, consulte tokens.For more information, see Tokens.

El argumento token-String se compone de una serie de tokens, como palabras clave, constantes o instrucciones completas.The token-string argument consists of a series of tokens, such as keywords, constants, or complete statements. Uno o más caracteres de espacio en blanco deben separar la cadena de token del identificador.One or more white-space characters must separate token-string from identifier. Este espacio en blanco no se considera parte de texto sustituido, ni tampoco cualquier espacio en blanco que vaya después del último token del texto.This white space is not considered part of the substituted text, nor is any white space that follows the last token of the text.

Un #define sin una cadena de token quita las apariciones del identificador del archivo de código fuente.A #define without a token-string removes occurrences of identifier from the source file. El identificador permanece definido y se puede probar mediante las #if defined #ifdef directivas y.The identifier remains defined and can be tested by using the #if defined and #ifdef directives.

El segundo formato de sintaxis define una macro de tipo función con parámetros.The second syntax form defines a function-like macro with parameters. Este formato acepta una lista opcional de parámetros que deben aparecer entre paréntesis.This form accepts an optional list of parameters that must appear in parentheses. Una vez definida la macro, cada repetición posterior del identificador( IdentifierOPT,..., IdentifierOPT ) se reemplaza con una versión del argumento de cadena de token que tiene argumentos reales sustituidos por parámetros formales.After the macro is defined, each subsequent occurrence of identifier( identifieropt, ..., identifieropt ) is replaced with a version of the token-string argument that has actual arguments substituted for formal parameters.

Los nombres de parámetros formales aparecen en cadena de token para marcar las ubicaciones donde se sustituyen los valores reales.Formal parameter names appear in token-string to mark the locations where actual values are substituted. Cada nombre de parámetro puede aparecer varias veces en la cadena de tokeny los nombres pueden aparecer en cualquier orden.Each parameter name can appear multiple times in token-string, and the names can appear in any order. El número de argumentos de la llamada debe coincidir con el número de parámetros en la definición de macro.The number of arguments in the call must match the number of parameters in the macro definition. El uso racional de paréntesis garantiza que los argumentos complejos se interpreten correctamente.Liberal use of parentheses guarantees that complex actual arguments are interpreted correctly.

Los parámetros formales de la lista están separados por comas.The formal parameters in the list are separated by commas. Cada nombre de la lista debe ser único, y la lista se debe incluir entre paréntesis.Each name in the list must be unique, and the list must be enclosed in parentheses. Ningún espacio puede separar el identificador y el paréntesis de apertura.No spaces can separate identifier and the opening parenthesis. Usar la concatenación de línea: coloca una barra diagonal inversa ( \ ) inmediatamente antes del carácter de nueva línea, para las directivas largas en varias líneas de código fuente.Use line concatenation — place a backslash (\) immediately before the newline character — for long directives on multiple source lines. El ámbito de un nombre de parámetro formal se extiende a la nueva línea que finaliza la cadena de token.The scope of a formal parameter name extends to the new line that ends token-string.

Cuando una macro se ha definido con el segundo formato de sintaxis, las instancias textuales subsiguientes seguidas de una lista de argumentos indican una llamada a macro.When a macro has been defined in the second syntax form, subsequent textual instances followed by an argument list indicate a macro call. Los argumentos reales que siguen a una instancia de Identifier en el archivo de código fuente coinciden con los parámetros formales correspondientes en la definición de macro.The actual arguments that follows an instance of identifier in the source file are matched to the corresponding formal parameters in the macro definition. Cada parámetro formal de la cadena de token que no está precedido por un operador de generación de cadenas ( # ), carácter ( #@ ) o de pegado de token ( ## ), o no seguido de un ## operador, se reemplaza por el argumento real correspondiente.Each formal parameter in token-string that is not preceded by a stringizing (#), charizing (#@), or token-pasting (##) operator, or not followed by a ## operator, is replaced by the corresponding actual argument. Cualquier macro en el argumento real se expande antes de que la directiva reemplace el parámetro formal.Any macros in the actual argument are expanded before the directive replaces the formal parameter. (Los operadores se describen en operadores de preprocesador).(The operators are described in Preprocessor operators.)

Los siguientes ejemplos de macros con argumentos muestran el segundo formato de la sintaxis de #define :The following examples of macros with arguments illustrate the second form of the #define syntax:

// 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 a veces hacen que las macros den resultados inesperados.Arguments with side effects sometimes cause macros to produce unexpected results. Un parámetro formal determinado puede aparecer más de una vez en la cadena de token.A given formal parameter may appear more than one time in token-string. Si ese parámetro formal se sustituye por una expresión con efectos secundarios, la expresión, con sus efectos secundarios, se puede evaluar más de una vez.If that formal parameter is replaced by an expression with side effects, the expression, with its side effects, may be evaluated more than one time. (Vea los ejemplos en operador de pegado de tokens (# #)).(See the examples under Token-Pasting Operator (##).)

La directiva #undef hace que se olvide la definición de preprocesador de un identificador.The #undef directive causes an identifier's preprocessor definition to be forgotten. Vea la directiva #undef para obtener más información.See The #undef Directive for more information.

Si el nombre de la macro que se está definiendo se produce en la cadena de token (incluso como resultado de otra expansión de macro), no se expande.If the name of the macro being defined occurs in token-string (even as a result of another macro expansion), it is not expanded.

Un segundo #define para una macro con el mismo nombre genera una advertencia a menos que la segunda secuencia del token sea idéntica a la primera.A second #define for a macro with the same name generates a warning unless the second token sequence is identical to the first.

Específicos de MicrosoftMicrosoft Specific

Microsoft C/C++ permite volver a definir una macro si la nueva definición es sintácticamente idéntica a la definición original.Microsoft C/C++ lets you redefine a macro if the new definition is syntactically identical to the original definition. Es decir, las dos definiciones pueden tener distintos nombres de parámetro.In other words, the two definitions can have different parameter names. Este comportamiento difiere de ANSI C, que requiere que las dos definiciones sean léxicamente idénticas.This behavior differs from ANSI C, which requires that the two definitions be lexically identical.

Por ejemplo, las dos macros siguientes son idénticas salvo en los nombres de parámetro.For example, the following two macros are identical except for the parameter names. ANSI C no permite esa nueva definición, pero Microsoft C/C++ la compila sin errores.ANSI C does not allow such a redefinition, but Microsoft C/C++ compiles it without error.

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

Por otra parte, las dos macros siguientes no son idénticas y se generará una advertencia en Microsoft C/C++.On the other hand, the following two macros are not identical and will generate a warning in Microsoft C/C++.

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

FIN de Específicos de MicrosoftEND Microsoft Specific

En este ejemplo se muestra la Directiva de #define :This example illustrates the #define directive:

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

La primera instrucción define el identificador WIDTH como la constante de tipo entero 80 y define LENGTH en términos de WIDTH y la constante de tipo entero 10.The first statement defines the identifier WIDTH as the integer constant 80 and defines LENGTH in terms of WIDTH and the integer constant 10. Cada aparición de LENGTH se reemplaza con (WIDTH + 10).Each occurrence of LENGTH is replaced by (WIDTH + 10). A su vez, cada aparición de WIDTH + 10 se reemplaza con la expresión (80 + 10).In turn, each occurrence of WIDTH + 10 is replaced by the expression (80 + 10). Los paréntesis alrededor de WIDTH + 10 son importantes, porque controlan la interpretación en instrucciones como las siguientes:The parentheses around WIDTH + 10 are important because they control the interpretation in statements such as the following:

var = LENGTH * 20;

Después de la fase de preprocesamiento, la instrucción se convierte en:After the preprocessing stage the statement becomes:

var = ( 80 + 10 ) * 20;

que se evalúa como 1800.which evaluates to 1800. Sin paréntesis, el resultado es:Without parentheses, the result is:

var = 80 + 10 * 20;

que se evalúa como 280.which evaluates to 280.

Específicos de MicrosoftMicrosoft Specific

La definición de macros y constantes con la opción del compilador /d tiene el mismo efecto que el uso de una directiva de preprocesamiento #define al principio del archivo.Defining macros and constants with the /D compiler option has the same effect as using a #define preprocessing directive at the start of your file. Se pueden definir hasta 30 macros mediante la opción /D.Up to 30 macros can be defined by using the /D option.

FIN de Específicos de MicrosoftEND Microsoft Specific

Vea tambiénSee also

Directivas de preprocesadorPreprocessor directives