Dubbio direttive condizionali e inclusione file header

di il
4 risposte

Dubbio direttive condizionali e inclusione file header

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.

4 Risposte

  • Re: Dubbio direttive condizionali e inclusione file header

    Il "sistema" che porti come esempio serve solo ad evitare che all'interno della singola compilazione di un file .c venga incluso più volte una porzione di un .h.
    In altre parole, serve ad evitare che se per qualche motivo dichiarazioni.h venga incluso più volte (caso tipico è che venga incluso in altri .h) ti venga dato un errore (in questo caso con la variabile provavar).
    Questo "sistema" non ha effetti su diverse compilazioni (cioè diversi .c).
  • Re: Dubbio direttive condizionali e inclusione file header

    candaluar ha scritto:


    Il "sistema" che porti come esempio serve solo ad evitare che all'interno della singola compilazione di un file .c venga incluso più volte una porzione di un .h.
    In altre parole, serve ad evitare che se per qualche motivo dichiarazioni.h venga incluso più volte (caso tipico è che venga incluso in altri .h) ti venga dato un errore (in questo caso con la variabile provavar).
    Questo "sistema" non ha effetti su diverse compilazioni (cioè diversi .c).
    Prima di tutto grazie candaluar,
    ma quindi non c'è modo di evitare, concettualmente, quello che cercavo di fare? Unico modo è evidare l'assegnazione all'interno di un file .h?
    Scusa la domanda, banale, perché dovrei includere all'interno di un file .h un altro file .h? Generalmente nel file .h non si pongono solo dichiarazioni in definitiva?

    Ti ringrazio per il tuo supporto alla mia comprensione.
    Grazie
  • Re: Dubbio direttive condizionali e inclusione file header

    Per fare quello che vuoi tu puoi settare una costante diversa all'inizio di ciascun file .c e poi utilizzare queste indicazioni per capire cosa fare nel .h.
  • Re: Dubbio direttive condizionali e inclusione file header

    candaluar ha scritto:


    Per fare quello che vuoi tu puoi settare una costante diversa all'inizio di ciascun file .c e poi utilizzare queste indicazioni per capire cosa fare nel .h.
    Ciao Candular,
    grazie della tua dritta.
    Provo ad adottare questo approccio.

    Grazie molte.
Devi accedere o registrarti per scrivere nel forum
4 risposte