Ciao a tutti,
riallacciandomi ad alcuni problemi che avevo sottoposto, qualche post fa, vi sottopongo ancora qualche dubbio o meglio qualche mia probabile non comprensione di alcune procedure e funzionalità esposte dal pre-processore del C.
Se non ho inteso male, utilizzando le direttive condizionali è possibile decidere quando e come includere il contenuto di un file .h e/o modificare il codice di un sorgente .c in fase di compilazione.
Ma veniamo al mio terribile quesito e rompicapo...
Restringendo la questione sull'inclusione dei file .h, il fine è di evitare la dichiarazione e valorizzazione di una variabile più di una volta; cosa che questa manda in errore il compilatore. Non voglio entrare nel merito se una dichiarazione inizializzazione di una varibile sia corretta all'interno di file .h, ma voglio solo approfondire il funzionamento del pre-processore rispetto alle direttive condizionali.
Riporto, a ti tolo di esempio, dei frammenti di codice privi di utilità, ma esclusivamente aventi funzione esplicativa.
File header dichiarazioni.h:
#if !defined(INCL)
#define INCL
int provavar = 1;
int somma(int a,int b);
#define square(x) ((x) * (x))
#endif
File calcolo.h
#include <stdlib.h>
#include <stdio.h>
#include "dichiarazioni.h"
int somma(int a,int b)
{
return (a+b);
}
File mytest.c:
#include <stdio.h>
#include <stdlib.h>
#include "dichiarazioni.h"
int main(int argc, char *argv[])
{
int x=5;
printf("sqare(%d+1) = %d\n", x+1, square(x+1));
return 0;
}
Da quello che credevo di aver compreso, la prima volta che viene richiamato il file dichiarazioni.h, non essendo definito "INCL", si procede immediatamente a definirlo e immediatamente dopo si effettuano le successive operazioni (dichiarazioni di prototipi e variabili)
La teoria, vorrebbe, che la seconda inclusione non avvenga perché "INCL" risulta già dichiarata.
Ho provato ha eseguire gcc con il parametro -E e posso osservare quanto segue:
# 1 "dichiarazioni.h" 1
# 4 "dichiarazioni.h"
int provavar = 1;
int somma(int a,int b);
# 4 "calcolo.c" 2
int somma(int a,int b)
{
return (a+b);
}
# 1 "dichiarazioni.h" 1
# 4 "dichiarazioni.h"
int provavar = 1;
int somma(int a,int b);
# 4 "mytest.c" 2
Da quello che credo di poter dedurre è che le dichiarazioni all'interno delle direttive condizionali vengono sempre incluse in tutti e due il file .c
Sto certamente sbagliano e non comprendendo il funzionamento delle direttive condizionali e di come lavora il pre-processore.
Vi sarei grato mi indicaste cosa mi sta sfuggendo.
Grazie infinite.