Les directives del preprocessador són instruccions que es donen al compilador per processar certs aspectes del codi abans de la compilació pròpiament dita. Aquestes directives comencen amb el símbol # i no requereixen punt i coma al final. Les directives del preprocessador són molt útils per a la gestió de constants, inclusió de fitxers, i condicions de compilació.

Conceptes Clau

  1. Inclusió de Fitxers (#include)
  2. Definició de Constants (#define)
  3. Condicions de Compilació (#ifdef, #ifndef, #if, #else, #elif, #endif)
  4. Macros amb Arguments
  5. Directives Especials (#undef, #pragma)

  1. Inclusió de Fitxers (#include)

La directiva #include s'utilitza per incloure el contingut d'un fitxer en un altre fitxer. Hi ha dues formes principals d'utilitzar #include:

  • Incloure fitxers de capçalera del sistema: Utilitza els signes de menor i major (< >).

    #include <stdio.h>
    #include <stdlib.h>
    
  • Incloure fitxers de capçalera definits per l'usuari: Utilitza cometes dobles (" ").

    #include "mi_fitxer.h"
    

  1. Definició de Constants (#define)

La directiva #define s'utilitza per definir constants o macros. Les constants definides amb #define no tenen tipus i són substituïdes literalment en el codi.

#define PI 3.14159
#define MAX_BUFFER_SIZE 1024

Exemple Pràctic

#include <stdio.h>

#define PI 3.14159
#define AREA_CERCLE(radi) (PI * (radi) * (radi))

int main() {
    float radi = 5.0;
    float area = AREA_CERCLE(radi);
    printf("L'àrea del cercle amb radi %.2f és %.2f\n", radi, area);
    return 0;
}

  1. Condicions de Compilació

Les directives condicionals permeten incloure o excloure parts del codi en funció de certes condicions.

  • #ifdef i #ifndef: Comproven si una macro està definida o no.

    #ifdef DEBUG
    printf("Mode de depuració activat\n");
    #endif
    
  • #if, #else, #elif, #endif: Permeten condicions més complexes.

    #define VERSION 2
    
    #if VERSION == 1
    printf("Versió 1\n");
    #elif VERSION == 2
    printf("Versió 2\n");
    #else
    printf("Versió desconeguda\n");
    #endif
    

  1. Macros amb Arguments

Les macros poden acceptar arguments, cosa que les fa molt més flexibles.

#define MAX(a, b) ((a) > (b) ? (a) : (b))

int main() {
    int x = 5, y = 10;
    printf("El màxim entre %d i %d és %d\n", x, y, MAX(x, y));
    return 0;
}

  1. Directives Especials

  • #undef: Elimina una definició de macro.

    #define TEMP 100
    #undef TEMP
    
  • #pragma: Proporciona instruccions especials al compilador.

    #pragma once
    

Exercicis Pràctics

Exercici 1: Definició de Constants

Defineix una constant per a la velocitat de la llum (299792458 m/s) i utilitza-la per calcular el temps que triga la llum a recórrer una distància donada.

#include <stdio.h>

#define VELOCITAT_LUM 299792458

int main() {
    double distancia = 1.0e9; // 1.000.000.000 metres
    double temps = distancia / VELOCITAT_LUM;
    printf("El temps que triga la llum a recórrer %.0f metres és %.9f segons\n", distancia, temps);
    return 0;
}

Exercici 2: Macros amb Arguments

Defineix una macro que calculi el quadrat d'un nombre i utilitza-la en un programa.

#include <stdio.h>

#define QUADRAT(x) ((x) * (x))

int main() {
    int num = 4;
    printf("El quadrat de %d és %d\n", num, QUADRAT(num));
    return 0;
}

Exercici 3: Condicions de Compilació

Escriu un programa que imprimeixi diferents missatges en funció d'una macro de depuració.

#include <stdio.h>

#define DEBUG

int main() {
    #ifdef DEBUG
    printf("Mode de depuració activat\n");
    #else
    printf("Mode de producció activat\n");
    #endif
    return 0;
}

Resum

En aquesta secció, hem après sobre les directives del preprocessador en C, incloent la inclusió de fitxers, definició de constants, condicions de compilació, macros amb arguments i directives especials. Aquestes eines són fonamentals per escriure codi més flexible, llegible i mantenible. En el següent tema, explorarem els arguments de línia de comandes.

Curs de Programació en C

Mòdul 1: Introducció al C

Mòdul 2: Tipus de Dades i Variables

Mòdul 3: Flux de Control

Mòdul 4: Funcions

Mòdul 5: Arrays i Strings

Mòdul 6: Punteres

Mòdul 7: Estructures i Unions

Mòdul 8: Assignació Dinàmica de Memòria

Mòdul 9: Gestió d'Arxius

Mòdul 10: Temes Avançats

Mòdul 11: Millors Pràctiques i Optimització

Mòdul 12: Projecte i Avaluació Final

© Copyright 2024. Tots els drets reservats