Newsgroup: it.comp.lang.c
Titolo: preprocessore

salve a tutti,
 sono anni ormai anni che uso questo metodo per evitare di dichiarare
extern variabili globali presenti nei miei progetti. In pratica uso un
header GenGlobal.h dove dentro ho:
 
 #ifdef GLOBAL_VARS
   #define EXT
   #define EQ  =
 #else
   #define EXT extern
   #define EQ  ;##/##/
 #endif
 
 e definisco GLOBAL_VARS dentro a  main.c prima di includere Gengloba.h:
 
 #define GLOBAL_VARS
 
 #include "GenGlobal.h"
 
 EXT int i EQ 100;//questo è come io dichiaro le mie variabili globali
 
 void main(void)
 {
  return;
 }
 
 In questo modo quando il compilatore compila main.c i sarà dichiarata
come:
 
 int i = 100;
 
 mentre quando il compilatore compila qualsiasi altro file dove non c'e
GLOBAL_VARS i sarà dichiarata così:
 
 extern i;//100;//questo...
 
 ora però ho un compilatore (MPLAB) che non capisce la linea
 
 #define EQ  ;##/##/
 
 può qualcuno suggerirmi un'altro modo per fare la stessa cosa o
 semplicemente dirmi se c'è un altro modo per sostituire a EQ i caratteri
 ;// ?
 
 
 grazie anticipate
 Ivan
 
 


Cambiare il compilatore con uno più moderno :-)
Battuta a parte temo che se il compilatore (deve essere molto vecchio, 
pre ANSI) non supporta ## come operatore per concatenare le stringhe 
devi cambiare tutte le dichiarazioni.  Tra le altre cose sei sicuro 
che riconosca "//" come introduzione ai commenti?
Posso solo suggerirti di usare un preprocessore recente sostituendolo, 
se è possibile, al preprocessore del compilatore oppure fare un passo 
di preprocessore al file .c prima di passarlo al compilatore.
Ciao
Giovanni
-- 
   A computer is like an air conditioner,
   it stops working when you open Windows.
   Registered Linux user #337974  < 
http://giovanni.homelinux.net/
 >

"Ivan" ha scritto

Premesso che è sconsigliato l'uso delle variabili globali, potresti fare
così.
Elimini il file GenGlobal.h e in ogni file .c metti quanto segue.
#ifdef GLOBAL_VARS
    int i = 100;
#else
    extern int i;
#endif
#define GLOBAL_VARS va solo su un file .c (es main.c).
Oppure in main.c metti
    int i = 100;
e in GenGlobal.h metti
    extern int i;
Ogni file .c poi deve includere GenGlobal.h.
Osservazione: con il metodo che usi quando aggiungi, elimini o rinomini una
variabile globale devi andare a modificare tutti i file .c. Se hai un
programma con 100 file, devi modificare 100 file!!!!
Il secondo metodo che ho indicato consente invece di intervenire solo in 2
punti.
In ogni caso le variabili globali sarebbero da evitare se possibile.

 
non sapevo si potesse usare un preprocessore differente da quello che e nel
compilatore. Mi indirizzeresti su qualcuno buono? .. anche se penso non sia
possibile usarne uno differente qui, e' embedded...

 programma con 100 file, devi modificare 100 file!!!!
non se usi un singolo file "global.h" dove dichiari tutte le tue globali,
includi global.h in tutti i tuoi .c files dopo Genglobal.h e usi la macro
spiegata sopra. Allora quando cambi/togli una variabile basta farlo in un
solo punto Global.h


 possibile usarne uno differente qui, e' embedded...
In genere il compilatore dovrebbe avere delle opzioni per cui gli dici dove
deve fermarsi nella fase di compilazione. Ad esempio solo la fase di
preprocessing, o fino a creare il listato assembly senza lanciare
l'assembler per creare il file oggetto. In output hai un file che dipende da
dove hai deciso di fermarti.
Quindi potresti usare un compilatore per una prima fase e un secondo
compilatore che lavora sull'output del primo. E' un po' laborioso,
francamente non so se ne vale la pena.

 solo punto Global.h
OK

 possibile usarne uno differente qui, e' embedded...
Molti compilatori sono composti da vari passi e ciascun passo è
compito di un eseguibile diverso.  In teoria è possibile sostituire
l'eseguibile del prepeocessore con uno più aggiornato.  Se invece il
compilatore è un unico eseguibile devi fare un passo prima di
compilare producendo un file intermedio.
Quanto al preprocessore da usare dipende su che ambiente lavori.
In ogni caso il compilatore gcc gira su molti ambienti ed ha 'cpp'
come preprocessore (almeno in ambiente unix).


 #endif
Non ci vedo un gran vantaggio ma - se ho capito bene quello che vuoi -
puoi fare così:
#ifdef GLOBAL_VARS
#define EXTERN(type, name, value) \
        type name = value
#else
#define EXTERN(type, name, value) \
        extern type name
#endif
da usare ovviamente come:
EXTERN(int, foo, 123);
Luca
-- 
"Sei l'unica donna della mia vita".
(Adamo)

salve a tutti,
sono anni ormai anni che uso questo metodo per evitare di dichiarare extern
variabili globali presenti nei miei progetti. In pratica uso un header
GenGlobal.h dove dentro ho:
#ifdef GLOBAL_VARS
  #define EXT
  #define EQ  =
#else
  #define EXT extern
  #define EQ  ;##/##/
#endif
e definisco GLOBAL_VARS dentro a  main.c prima di includere Gengloba.h:
#define GLOBAL_VARS
#include "GenGlobal.h"
EXT int i EQ 100;//questo è come io dichiaro le mie variabili globali
void main(void)
{
 return;
}
In questo modo quando il compilatore compila main.c i sarà dichiarata come:
int i = 100;
mentre quando il compilatore compila qualsiasi altro file i sarà dichiarata
così:
extern i;//100...
ora però ho un compilatore che non capisce la linea
#define EQ  ;##/##/
può qualcuno suggerirmi un'altro modo per fare la stessa cosa o
semplicemente dirmi se c'è un altro modo per sostituire a EQ i caratteri
;//?
grazie anticipate
Ivan