C/Visual C - #if #elif ...

 
Vista:

#if #elif ...

Publicado por quantium (1 intervención) el 01/11/2002 14:47:20
Hola a todos.

Tengo entendido que estas directivas lo que permiten es compilar selectivamente ciertas partes del codigo fuente de un programa. Creo que se llama "compilacion condicional"

Y mi pregunta es: ¿que ventajas tiene usar estas directivas frente a "if", "else" "else if" ...? La unica que se me ocurre es que el programa ira mas rapido en la maquina porque cada vez que se ejecute el programa no tendrea que comprobar algunas variables y demas, por poner un ejemplo:

#define VALOR 5

int main(void)
{
int i=0;

#if VALOR==10
puts("desde 0 - 10");

#elif VALOR==5
puts("desde 0 - 5");

#elif VALOR!=5 || VALOR!=10
puts("no sabemos que va a mostrar");

#endif

for(;i<VALOR;i++) printf("%i\n",i);

return 0;
}


Este programa se podria hacer tambien usando if


#define VALOR 20

int main(void)
{
int i=0;

if( VALOR==10 )
puts("desde 0 - 10");

if( VALOR==5 )
puts("desde 0 - 5");

if( VALOR!=5 || VALOR!=10 )
puts("no sabemos que va a mostrar");


for(;i<VALOR;i++) printf("%i\n",i);

return 0;
}

Con el 2º programa siempre se comprobara el numero de VALOR, con lo que el programa sera mas lento que el primero.

¿alguien me podria mas motivos para usar #if, #else ...?

Muchas gracias a todos y un saludo.



Valora esta pregunta
Me gusta: Está pregunta es útil y esta claraNo me gusta: Está pregunta no esta clara o no es útil
0
Responder

RE:#if #elif ...

Publicado por El Mogur (202 intervenciones) el 01/11/2002 21:56:13
Realmente las directivas #if y #elif, no se suelen utilizar con constantes como tu usas en el ejemplo, o si se usan con valores constantes no son valores que se utilizan dentro del codigo.
Me explico. Puedes querer crear un codigo fuente que pueda ser compilado tanto en Linux como en Windows. Sin embargo, existen funciones, por ejemplo para crear sockets, cuyos prototipos son distintos en ambas plataformas. En ese caso, para que tu codigo sea compatible, usarías:

// Uno de los dos simbolos estara definido, y el otro comentado.
//#define __WINDOWS__
//#define __LINUX__

bool MiFuncionQueCreaUnSocket() {
#ifdef __WINDOWS__
...
#else
#ifdef __LINUX
...
#endif
#endif
}

Esto sería el uso normal. Pero a veces, se pueden definir constantes y utilizarlas en las directivas #if, como tu dices. Por ejemplo, puedes estar haciendo una función que dibuje en tres dimensiones utilizando DirectX, pero utiliza distintos métodos dependiendo de la versión de DirectX para la que lo compiles. Entonces harías:
#define __VERSION__DX
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar

RE:#if #elif ...

Publicado por El Mogur (202 intervenciones) el 01/11/2002 21:59:04
Realmente las directivas #if y #elif, no se suelen utilizar con constantes como tu usas en el ejemplo, o si se usan con valores constantes no son valores que se utilizan dentro del codigo.
Me explico. Puedes querer crear un codigo fuente que pueda ser compilado tanto en Linux como en Windows. Sin embargo, existen funciones, por ejemplo para crear sockets, cuyos prototipos son distintos en ambas plataformas. En ese caso, para que tu codigo sea compatible, usarías:

// Uno de los dos simbolos estara definido, y el otro comentado.
//#define __WINDOWS__
//#define __LINUX__

bool MiFuncionQueCreaUnSocket() {
#ifdef __WINDOWS__
...
#else
#ifdef __LINUX
...
#endif
#endif
}

Esto sería el uso normal. Pero a veces, se pueden definir constantes y utilizarlas en las directivas #if, como tu dices. Por ejemplo, puedes estar haciendo una función que dibuje en tres dimensiones utilizando DirectX, pero utiliza distintos métodos dependiendo de la versión de DirectX para la que lo compiles. Entonces harías:
#define __VERSION__DX 8

void Dibuja() {
#if __VERSION__DX == 6

#elif __VERSION__DX == 7

#elif __VERSION__DX == 8

#else
#error "Version DX no definida"
#endif
}

En este caso, se quiere compilar un trozo de código u otro, pero no dependiendo únicamente de si un simbolo está definido, sino de su valor.

En resumen: en este caso, las constantes que se crean con #define no suelen ser necesarias después dentro del código, sino únicamente para ser utilizadas en las directivas del precompilador para s
Valora esta respuesta
Me gusta: Está respuesta es útil y esta claraNo me gusta: Está respuesta no esta clara o no es útil
0
Comentar