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
- Inclusió de Fitxers (
#include
) - Definició de Constants (
#define
) - Condicions de Compilació (
#ifdef
,#ifndef
,#if
,#else
,#elif
,#endif
) - Macros amb Arguments
- Directives Especials (
#undef
,#pragma
)
- Inclusió de Fitxers (
#include
)
#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"
- Definició de Constants (
#define
)
#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.
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; }
- 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
- 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; }
- 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
- Introducció a la Programació
- Configuració de l'Entorn de Desenvolupament
- Programa Hello World
- Sintaxi i Estructura Bàsiques
Mòdul 2: Tipus de Dades i Variables
Mòdul 3: Flux de Control
Mòdul 4: Funcions
- Introducció a les Funcions
- Arguments de Funció i Valors de Retorn
- Àmbit i Durada de les Variables
- Funcions Recursives
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
- Introducció a la Gestió d'Arxius
- Lectura i Escriptura d'Arxius
- Posicionament d'Arxius
- Gestió d'Errors en Operacions d'Arxius
Mòdul 10: Temes Avançats
- Directives del Preprocessador
- Arguments de Línia de Comandes
- Llistes d'Arguments Variables
- Multifil en C
Mòdul 11: Millors Pràctiques i Optimització
- Llegibilitat del Codi i Documentació
- Tècniques de Depuració
- Optimització del Rendiment
- Consideracions de Seguretat