Al momento de crear un proyecto en CodeBlocks siempre aparece en el abajo una sentencia #endif
¿Que significa esto? ¿Que función le puedo dar a esto?
- 49,291
- 5
- 30
- 72
- 174
- 2
- 13
2 Answers
A eso se les llama Directivas de pre-procesadores, en este caso directamente serian directivas de inclucion condicional.
Segun la documentacion:
Estas directivas permiten incluir o descartar parte del código de un programa si se cumple una determinada condición.
#ifdef
permite compilar una sección de un programa solo si la macro que se especifica como parámetro ha sido definida, sin importar cuál sea su valor.
Por ejemplo digamos que tienes una aplicacion y te gustaria que cuando estes desarrollando, siempre inicie con un usuario determinado. En este caso las estas directivas te pueden ayudar:
#define PRUEBA
#ifdef PRUEBA
// CODIGO PARA CARGAR USUARIO POR DEFECTO
#endif
El código dentro de la directiva solo sera compilado si PRUEBA
esta definida. Así cuando vayas a publica tu aplicación, solo tendieras que eliminar la definicion de PRUEBA
y el programa seguira su flujo normal.
- 20,190
- 2
- 14
- 36
Tal y como ha comentado Einer las directivas de pre-procesador #endif
, #if
y #ifdef
(y #ifndef
, #elif
, #else
y #endif
que no habéis mencionado) son directivas de inclusión condicional de código.
Estas directivas no son exclusivas de C++, también son usadas en c.
Fases de traducción.
El proceso de compilación de código se divide en 9 fases en C++, a grandes rasgos:
- Se comprueba que todos los caracteres del código son usables.
- Se unen las líneas separadas por barra descendente (
\
). - Se clasifica el contenido del código en comentarios, espacios y directivas de pre-procesador; los comentarios son substituidos por un espacio (
).
- Se ejecuta el pre-procesador.
- Se procesan los literales de cadena de texto (las secuencias de escape se reemplazan por el caracter correspondiente).
- Se concatenan los literales de texto adyacentes.
- Se analiza sintáctica y semánticamente el código y se compila.
- Se examinan las unidades de traducción para listar las instancias de plantillas requeridas en cada una.
- Se unen las unidades de traducción para generar el programa final.
¿Qué hace la fase 4?
En la fase 4 se ejecuta el pre-procesador, todas las macro #define
son reemplazadas por el valor definido, el contenido de los archivos incluidos mediante #include
es copia-pegado en el punto en que aparece la directiva (aplicándoles las fases 1 a 4 recursivamente) y el código que no cumpla con las condiciones de inclusión condicional (#endif
, #if
, #ifdef
, #ifndef
, #elif
, #else
y #endif
) es eliminado.
Supongamos que tenemos estos archivos:
Objeto.hpp
#ifndef OBJETO_HPP
#define OBJETO_HPP
struct Objeto {
int a, e, i, o, u;
const bool debug =
#ifdef _DEBUG
true;
#else
false;
#endif
};
#endif
main.cpp
#include "Objeto.hpp"
#include "Objeto.hpp"
int main()
{
return 0;
}
El archivo main.cpp
sufrirá las siguientes transformaciones al ser compilado (en el ejemplo lo compilaremos con _DEBUG
definido):
Resolver inclusiones (
#include "archivo"
).#ifndef OBJETO_HPP #define OBJETO_HPP struct Objeto { int a, e, i, o, u; const bool debug = #ifdef _DEBUG true; #else false; #endif }; #endif #ifndef OBJETO_HPP #define OBJETO_HPP struct Objeto { int a, e, i, o, u; const bool debug = #ifdef _DEBUG true; #else false; #endif }; #endif int main() { return 0; }
Eliminar el código no incluido condicionalmente (
#endif
,#if
,#ifdef
,#ifndef
,#elif
,#else
y#endif
).#ifndef OBJETO_HPP #define OBJETO_HPP struct Objeto { int a, e, i, o, u; const bool debug = #ifdef _DEBUG true; #else #endif }; #endif #ifndef OBJETO_HPP #endif int main() { return 0; }
Eliminar las directivas de pre-procesador (todo lo que empieza por
#
)struct Objeto { int a, e, i, o, u; const bool debug = true; }; int main() { return 0; }
El pre-procesador no es el compilador.
El compilador recibirá los archivos de código después de que el pre-procesador los haya digerido, ambas rutinas son independientes y no interactúan. Esto es importante ya que implica que no puedes usar nada del pre-procesador en C++ ni nada de C++ en el preprocesador:
#define CONCUPISCENCIA
bool funcion()
{
// vvvvvvvvvvvvvv <--- No funciona!!
if (CONCUPISCENCIA)
return false;
else
return true;
}
// vvvvvvvvv <--- No funciona
#if funcion()
int main()
#else
int WinMain()
#endif
{
return 0;
}
En el ejemplo anterior CONCUPISCENCIA
es un símbolo del pre-procesador así que no puede ser usado en un if
de C++ ya que el lenguaje no sabe de su existencia. Por otro lado la función bool funcion()
pertenece a C++ por ello el pre-procesador no la puede interpretar para la inclusión condicional.
- 44,474
- 6
- 44
- 82