2008-08-19 35 views
15

Me pregunto acerca de las instancias en las que hace que se envíen 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?¿Cómo se usa #define?

¿Es #define lo único que determina si el código se incluye 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?

Respuesta

12

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 de depuración opcional. 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() 
     } 
1

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

1

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, intente 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.

8

#define se utiliza para definir las constantes de tiempo de compilación que se pueden utilizar 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); 
    } 
1

@Ed: Cuando se utiliza C++, rara vez hay ningún beneficio para el uso de #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 he tenido que usar #define en mi C#, y muy raramente lo uso para cualquier otra cosa que la plataforma y la versión del compilador verifiquen la compilación condicional en C++.

3

Es #define lo único que determina si el código se incluye 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?

Puede undefine símbolos, así

#if defined(DEBUG) 
#undef DEBUG 
#endif 
0

Tal vez los usées más comunes de #define en C# es diferenciar entre debug/release y diferentes plataformas (por ejemplo, Windows y X-Box 360 en el XNA framework).

0

Es para la compilación condicional, por lo que puede incluir o eliminar fragmentos de código en base a los atributos del proyecto que tienden a ser:

  • plataforma Previsto (Windows/Linux/XB360/PS3/Iphone, etc ....)
  • de lanzamiento o de depuración (el registro general, afirma etc solamente están incluidos en una versión de depuración)

también se pueden utilizar para desactivar grandes partes de un sistema rápido, por ejemplo, durante el desarrollo de un juego , Podría definir

#define PLAYSOUNDS 

y luego envolver el último momento 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 que encienda y apaga la reproducción de sonidos para una generación. (Normalmente no reproduzco sonidos cuando se depura porque se interpone en mi música personal :)) La ventaja es que no está introduciendo una rama mediante la adición de una instrucción if ....