Saltar al contenido principal
LibreTexts Español

14.2: Compilación condicional

  • Page ID
    82165
  • \( \newcommand{\vecs}[1]{\overset { \scriptstyle \rightharpoonup} {\mathbf{#1}} } \) \( \newcommand{\vecd}[1]{\overset{-\!-\!\rightharpoonup}{\vphantom{a}\smash {#1}}} \)\(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\) \(\newcommand{\id}{\mathrm{id}}\) \( \newcommand{\Span}{\mathrm{span}}\) \( \newcommand{\kernel}{\mathrm{null}\,}\) \( \newcommand{\range}{\mathrm{range}\,}\) \( \newcommand{\RealPart}{\mathrm{Re}}\) \( \newcommand{\ImaginaryPart}{\mathrm{Im}}\) \( \newcommand{\Argument}{\mathrm{Arg}}\) \( \newcommand{\norm}[1]{\| #1 \|}\) \( \newcommand{\inner}[2]{\langle #1, #2 \rangle}\) \( \newcommand{\Span}{\mathrm{span}}\)\(\newcommand{\AA}{\unicode[.8,0]{x212B}}\)

    Supongamos por un momento que deseas crear dos o más versiones de un programa que difieran sólo en formas suaves. Si bien es posible mantener múltiples conjuntos de código fuente para cada uno, esto puede ser un dolor cuando llega el momento de corregir un error o agregar una característica ya que habrá que hacer alteraciones en cada uno de los archivos fuente. Sería mucho más fácil de alguna manera “marcar” partes del código fuente como pertenecientes a diferentes versiones del programa y luego hacer que el compilador o preprocesador haga el trabajo por usted. Esto es exactamente lo que es la compilación condicional. Para ello, explotamos el poder del preprocesador. Ya hemos visto la directiva #define como una forma de definir constantes o crear macros, pero podemos llevarla más allá. Mira el siguiente fragmento de ejemplo:

    #define VERSION_A
    
    #ifdef VERSION_A
    char title[] = "This is version A";
    #else
    char title[] = "This is some other version”;
    #endif
    

    Las directivas #if/#else/#endif actúan de manera similar a los comandos if/else. Tenga en cuenta que los paréntesis no se utilizan para bloquear secciones multilínea (de ahí la necesidad de la directiva #endif). En el ejemplo anterior, el título de la matriz char se inicializa a “Esta es la versión A”. Si comentáramos la línea #define VERSIÓN A, entonces el título se inicializaría a "Esta es alguna otra versión”. En algunos IDEs es posible crear variaciones sobre proyectos. Dentro de cada proyecto se pueden definir ciertos símbolos (como VERSION_A). De esta manera ni siquiera tendrías que comentar/descomentar el #define, sino solo seleccionar la variación del proyecto deseada. Tenga en cuenta que es posible anidar directivas #if /else. Además, no se limita a simplemente alterar las declaraciones globales. Esta técnica se puede utilizar tanto en código como en datos. De hecho, las funciones enteras pueden ser agregadas o excluidas de esta manera. Aquí hay otro uso típico:

    void some func( void )
    {
        //...code stuff...
    
    #ifdef DEBUG
        printf("Error in some_func, x=%d\n", x );
    #endif
    
    //...rest of function...
    }
    

    Si se define DEBUG, la llamada printf () se incluirá en el ejecutable. Si no se define, es como si la llamada printf () nunca existiera.


    This page titled 14.2: Compilación condicional is shared under a CC BY-NC-SA 4.0 license and was authored, remixed, and/or curated by James M. Fiore via source content that was edited to the style and standards of the LibreTexts platform; a detailed edit history is available upon request.