practices - generate documentation c#
¿Cómo se usa#define? (8)
Me pregunto acerca de las instancias en las que se envían las declaraciones #define y #if. Lo he sabido por un tiempo, pero nunca lo incorporé a mi forma de codificación. ¿Cómo afecta esto a la compilación?
¿Es #define lo único que determina si el código está incluido cuando se compila? Si tengo #define DEBUGme como un símbolo personalizado, la única forma de excluirlo de la compilación es eliminar esta declaración #define?
¿Es #define lo único que determina si el código está incluido cuando se compila? Si tengo #define DEBUGme como un símbolo personalizado, la única forma de excluirlo de la compilación es eliminar esta declaración #define?
También puedes definir los símbolos
#if defined(DEBUG)
#undef DEBUG
#endif
@Ed: cuando se usa C ++, rara vez se obtiene ningún beneficio por usar #define sobre las funciones en línea al crear macros. La idea de "mayor velocidad" es un concepto erróneo. Con las funciones en línea obtienes la misma velocidad, pero también obtienes seguridad de tipo, y sin efectos secundarios del preprocesador "pegando" debido al hecho de que los parámetros se evalúan antes de llamar a la función (por ejemplo, intenta escribir la omnipresente macro MAX) , y llámalo así: MAX (x ++, y) ... verás a qué me refiero).
Nunca tuve que usar #define en mi C #, y muy raramente lo uso para cualquier otra plataforma y compilación de versiones compilando condicionalmente en C ++.
A menudo me encuentro definiendo algunas cosas que se hacen repetitivamente en ciertas funciones. Eso hace que el código sea mucho más corto y, por lo tanto, permite una mejor visión general.
Pero como siempre, trate de encontrar una buena medida para no crear un nuevo idioma. Puede ser un poco difícil de leer para el mantenimiento ocasional más adelante.
Bueno, define se utilizan a menudo para constantes de tiempo de compilación y macros. Esto puede hacer que su código sea un poco más rápido ya que en realidad no hay llamadas a funciones, los valores de salida de las macros se determinan en tiempo de compilación. Los # if son muy útiles. El ejemplo más simple en el que puedo pensar es buscar una compilación de depuración para agregar algún registro o mensaje adicional, tal vez incluso algunas funciones de depuración. También puede verificar diferentes variables de entorno de esta manera.
Otros con más experiencia en C / C ++ pueden agregar más, estoy seguro.
Es para compilación condicional, por lo que puede incluir o eliminar fragmentos de código en función de los atributos del proyecto que tienden a ser:
- Plataforma prevista (Windows / Linux / XB360 / PS3 / Iphone .... etc)
- Liberar o depurar (generalmente el registro, las afirmaciones, etc. solo se incluyen en una compilación de depuración)
También se pueden usar para desactivar grandes partes de un sistema rápidamente, por ejemplo, durante el desarrollo de un juego, podría definir
#define PLAYSOUNDS
y luego envuelva la llamada final para reproducir un sonido en:
#ifdef PLAYSOUNDS
// Do lots of funk to play a sound
return true;
#else
return true;
Así que es muy fácil para mí activar y desactivar la reproducción de sonidos para una compilación. (Por lo general, no reproduzco sonidos cuando estoy depurando porque se interpone en mi música personal :)) El beneficio es que no estás introduciendo una rama al agregar una declaración if ....
Quizás los usos más comunes de #define en C # es diferenciar entre depuración / versión y diferentes plataformas (por ejemplo, Windows y X-Box 360 en el marco XNA).
#define se usa para definir constantes de tiempo de compilación que puede usar con #if para incluir o excluir bits de código.
#define USEFOREACH
#if USEFOREACH
foreach(var item in items)
{
#else
for(int i=0; i < items.Length; ++i)
{ var item = items[i]; //take item
#endif
doSomethingWithItem(item);
}
En C # #define
macros, como algunos de los ejemplos de Bernard, no están permitidos. El único uso común de #define
/ #if
s en C # es para agregar código opcional de depuración solo. Por ejemplo:
static void Main(string[] args)
{
#if DEBUG
//this only compiles if in DEBUG
Console.WriteLine("DEBUG")
#endif
#if !DEBUG
//this only compiles if not in DEBUG
Console.WriteLine("RELEASE")
#endif
//This always compiles
Console.ReadLine()
}