0Pricing
C Academy · Lezione

Compilazione condizionale

ifdef e macro

Compilazione condizionale è una lezione C Academy gratuita su CoddyKit. Questa è la lezione 1 di 4. Puoi leggere la lezione completa qui gratuitamente — poi esercitati direttamente nel browser con un editor di codice integrato e un tutor IA disponibile 24/7. Fa parte del percorso di apprendimento C Academy, e i tuoi progressi si sincronizzano tra il web e l'app CoddyKit. Il corso C Academy include 4 lezioni in totale.

Il preprocessore

Prima ancora che il compilatore veda il codice, entra in esecuzione il preprocessore. Gestisce ogni riga che inizia con #: inclusioni, macro e direttive condizionali.

La compilazione condizionale consente di includere o escludere blocchi di codice in base a condizioni valutate in questa fase, producendo build diverse a partire da un'unica sorgente.

Definire le macro

#define crea una macro. Senza un valore, è semplicemente un flag che può essere verificato in seguito.

Le macro simili a oggetti sostituiscono un nome con del testo; i flag indicano semplicemente che qualcosa è impostato.

#define MAX_USERS 100   /* value macro */
#define DEBUG          /* flag macro */

ifdef e ifndef

#ifdef NAME mantiene il blocco solo se NAME è definito. #ifndef lo mantiene solo se NAME non è definito.

In questo caso, la stampa di debug esiste solo nelle build di debug. Se DEBUG non è definito, il compilatore non vede neppure quella riga.

#include <stdio.h>
#define DEBUG

int main(void) {
#ifdef DEBUG
    printf("debug: starting\n");
#endif
    printf("running\n");
    return 0;
}

if, elif, else

#if valuta un'espressione intera costante. Lo combini con #elif e #else per una selezione a più rami.

In questo modo il codice viene scelto in base a una macro contenente un numero di versione.

#include <stdio.h>
#define VERSION 2

int main(void) {
#if VERSION >= 2
    printf("new feature on\n");
#else
    printf("legacy mode\n");
#endif
    return 0;
}

L'operatore defined

All'interno di #if può verificare se una macro è definita con defined(NAME) e combinare i test con && e ||.

È più flessibile di #ifdef, che può verificare un solo nome.

#if defined(LINUX) && !defined(EMBEDDED)
    /* desktop Linux code */
#endif

Definire in fase di compilazione

Non è necessario codificare le macro direttamente nel sorgente. Il flag -D le definisce dalla riga di comando.

È così che i sistemi di build attivano o disattivano funzionalità senza modificare il sorgente. -DDEBUG equivale a #define DEBUG all'inizio di ogni file.

gcc -DDEBUG -DVERSION=3 -o app app.c

Rilevamento della piattaforma

I compilatori predefiniscono macro che descrivono la destinazione. Può usarle per scrivere codice portabile.

  • _WIN32 — Windows (a 32 o 64 bit)
  • __linux__ — Linux
  • __APPLE__ — macOS / iOS

Usi queste condizioni per chiamare l'API corretta della piattaforma.

#ifdef _WIN32
    #include <windows.h>
#else
    #include <unistd.h>
#endif

Guardie di inclusione degli header

L'uso classico delle direttive condizionali è la guardia di inclusione, che impedisce di elaborare un header due volte.

La prima inclusione definisce la macro della guardia; le inclusioni successive saltano il corpo perché la macro è già definita.

#ifndef UTILS_H
#define UTILS_H

int add(int a, int b);

#endif /* UTILS_H */

Commentare il codice

#if 0 ... #endif disabilita in modo affidabile un blocco, anche se contiene già dei commenti.

A differenza di /* */, può essere annidato senza problemi, quindi è il modo standard per escludere temporaneamente del codice durante il debug.

#if 0
    legacy_function();   /* disabled for now */
    /* with internal comments too */
#endif

Esaminare l'output del preprocessore

Per vedere esattamente cosa compilerà il compilatore, esegua solo il preprocessore con -E.

Questa opzione espande tutte le inclusioni, le macro e le direttive condizionali, cosa preziosa quando una macro si comporta in modo imprevisto.

gcc -E app.c | less

Attivare le funzionalità nella pratica

Un modello comune consiste in un unico header di configurazione che attiva o disattiva le funzionalità per l'intero progetto.

Modifichi un solo #define e ogni blocco protetto in tutti i file reagirà. In questo modo le funzionalità opzionali restano nettamente separate dal codice principale.

#include <stdio.h>
#define FEATURE_LOGGING 1

int main(void) {
#if FEATURE_LOGGING
    printf("logging enabled\n");
#endif
    printf("app ready\n");
    return 0;
}

Verifica rapida

Preveda il comportamento di una definizione passata dalla riga di comando.

Riepilogo

Ora sa gestire la compilazione condizionale:

  • #ifdef/#ifndef verificano se una macro è definita
  • #if/#elif/#else valutano espressioni costanti, insieme a defined()
  • -DNAME definisce macro dalla riga di comando per attivare o disattivare funzionalità
  • Le macro predefinite della piattaforma consentono di scrivere codice portabile; le guardie di inclusione impediscono inclusioni multiple

Prossimo argomento: organizzare il codice in più file.

Domande Frequenti

La lezione «Compilazione condizionale» è gratuita?

Sì — il testo completo di «Compilazione condizionale» è gratuito qui sul web. Per esercitarvi in modo interattivo (un editor di codice integrato e un tutor IA 24/7) e sbloccare il resto del corso C Academy, passa a CoddyKit PRO. Il corso C Academy include 4 lezioni in totale.

Cosa imparerò in «Compilazione condizionale»?

ifdef e macro Eserciti C Academy con codice pratico che esegui direttamente nel browser, e un tutor IA 24/7 risponde alle tue domande mentre lavori sulla lezione.

Ho bisogno di esperienza per iniziare C Academy?

Non è richiesta alcuna esperienza precedente. C Academy su CoddyKit è strutturato per principianti e studenti avanzati, quindi puoi iniziare da qui o dall'inizio e procedere al tuo ritmo. Questa è la lezione 1 di 4.

Quanto tempo richiede la lezione «Compilazione condizionale»?

La maggior parte delle lezioni CoddyKit richiede circa 5–10 minuti. Ogni lezione è breve e interattiva, quindi fai progressi costanti e riprendi esattamente da dove hai lasciato su web e app.

Posso scrivere ed eseguire codice in questa lezione C Academy?

Sì. Ogni lezione C Academy include un editor di codice integrato, quindi scrivi ed esegui codice reale direttamente nel tuo browser e ricevi feedback istantaneo dall'IA — nessuna configurazione locale necessaria.

Tutte le lezioni di questo corso

  1. Compilazione condizionale
  2. Progetti su più file
  3. Makefile
  4. Librerie statiche e condivise
← Torna a C Academy