Newsgroup: it.hobby.elettronica.digitale
Titolo: [semiOT]

in assembly avevo tutte le mie belle define per la compilazione...
tipo:
USE_SENS_TEMPERATURA	EQU TRUE
  if USE_SENS_TEMPERATURA == TRUE
....
  endif
ora faccio qualcosa di analogo col C ma con uno svantaggio: se la define 
non è definita non mi dà errore,
//#define USE_SENS_TEMPERATURA TRUE
#if USE_SENS_TEMPERATURA == TRUE
// semplicemente l'if non è vero, perchè USE_SENS_TEMPERATURA non vale TRUE
#endif
Invece io vorrei che quell'errore mi esca in fase di compilazione, 
altrimenti se non sto attento e includo il file in un altro senza 
mettere a posto tutte le define me ne dimentico con possibili gravi 
problemi latenti (es. credendo erroneamente che quella define sia 
dichiarata in un altro file; già sperimentato e risolto in tempo!).
C'è un modo universale per fare in modo che il compilatore si lamenti se 
una define che incontra durante il preprocessing non è definita?
E se non c'è, esiste un modo per fare questo con il compilatore PIC30 
della Microchip?
ciao e grazie
  BQ

(ops l'oggetto)

 una define che incontra durante il preprocessing non è definita?
Di solito i compilatori si lamentato quando testi una costante non 
definita, quindi il modo migliore sarebbe controllare come mai il tuo 
compilatore non ha attivo questo basilare warning di default.
Alternativamente, un modo universale sarebbe quello di controllare prima 
per l'esistenza della costante stessa con un:
#if defined(USE_SENS_TEMPERATURA) && (USE_SENS_TEMPERATURA == TRUE)
...
-- 
  _|/ Francesco Sacchi - Develer S.r.l., R&D dept.
   |\ 
http://www.develer.com/
 - 
http://www.bertos.org/

 (ops l'oggetto)
La #ifndef dovrebbe aiutarti?!
ciao
Angelo

marcoangelo.r ha scritto:

sì, però però per ogni file in cui uso la define dovrei ricordarmi di 
scrivere all'inizio del file
#ifndef USE_SENS_TEMPERATURA
#error "definire USE_SENS_TEMPERATURA"
#endif
....
#if (USE_SENS_TEMPERATURA == TRUE)
#
...un po' pesantuccio! se ci fosse una direttiva di qualche tipo o un 
parametro da passare al compilatore (già cercato ma non lo trovo), 
sarebbe meglio
grazie cmq

 
però questa non mi genera un errore, se non sbaglio.
Niente, continuo a cercare se c'è qualche modo di attivare warning o 
error su una costante non definita.
Ho quasi il dubbio che a livello di ANSI C una costante non definita sia 
convertita in 0...

 
ok, ho trovato! a chi dovesse servire, si deve passare al compilatore il 
parametro -Wundef
e in effetti, quanto scrivo è vero, almeno per il mio compilatore, che 
non è molto distante dall'ansi c: se una costante non è definita, il 
preprocessore la considera 0.
grazie a tutti lo stesso
ciao
  BQ

 convertita in 0...
Aspetta: dal momento che usi delle #define non hai ancora a che fare con il
linguaggio C, ma con il preprocessore del C, che è un'altra cosa!
Quindi se fai una define senza assegnare una sostituzione il preprocessore
semplicemente fa sparire ogni occorrenza dal file senza dirti niente. E' per
questo che definire qualcosa true o false tramite la #define può essere
antipatico. Un modo per me più pulito è usare la #define in questo modo:
#define __VOGLIO_CHE_SUCCEDA_QUALCOSA__
..
#ifdef __VOGLIO_CHE_SUCCEDA_QUALCOSA__
 /* qui succede quello che voglio che succeda */
#else
 /* altrimenti faccio altro, ad esempio:*/
#error ...
#endif

 preprocessore la considera 0.
Non capisco come sia possibile. Sei sicuro? Il preprocessore può fare solo
delle sostituzioni testuali, e se tu definisci:
#define PIPPO 
ogni volta che il preprocessore trova PIPPO lo sostituisce con il niente, che
guarda caso è proprio quello che hai specificato tramite la define. Se non fai
la define, allora il compilatore (e non il preprocessore) darà errore perché
non sa cosa sia PIPPO.

SilverLeo ha scritto:

appena provato, inserendo:
#define TEST 13
#if TEST == 13
#error "bbbb"
#endif
mi dà errore "bbbb"
Questo:
//#define TEST 13
#if TEST == 13
#error "bbbb"
#endif
non mi dà errore
Questo:
//#define TEST 13
#if TEST == 0
#error "bbbb"
#endif
mi dà errore.
Questo:
#define TEST
#if TEST == 13
#error "bbbb"
#endif
mi dà errore "operator '==' has no left operand"
Questo:
#define TEST
#if TEST == 0
#error "bbbb"
#endif
mi dà errore "operator '==' has no left operand"

 
però ad esempio potrei voler fare qualcosa anche nel caso else:
ad esempio,
#if USE_BOOTLOADER == 1
unsigned char emulationPages[DATA_EE_BANKS * 
DATA_EE_NUM_PAGES][NUMBER_OF_INSTRUCTIONS_IN_PAGE * 2]
     __attribute__ ((space(psv), address(0x1000), noload));
#else
unsigned char emulationPages[DATA_EE_BANKS * 
DATA_EE_NUM_PAGES][NUMBER_OF_INSTRUCTIONS_IN_PAGE * 2]
     __attribute__ ((space(psv), aligned(NUMBER_OF_INSTRUCTIONS_IN_PAGE 
* 2), noload));
#endif
(uso questo spezzone per allocare, in caso di utilizzo del bootloader, 
ad un indirizzo particolare un array che mi simula una eeprom; il file 
che contiene lo spezzone è comune a più progetti e lo personalizzo con 
un header che cambia da progetto a progetto).
Solo che mi ero dimenticato di definire USE_BOOTLOADER nell'header 
personalizzato: risultato, mi aveva allocato la eeprom simulata in una 
zona che sarebbe stata cancellata durante la riprogrammazione del device...!
Io come metodo di lavoro quando creo un progetto nuovo, includo i file c 
che mi servono e e faccio passare tutti questi header di 
personalizzazione, modificando le define che mi serve modificare.
Però se per qualche motivo (qui, l'introduzione di un bootloader), devo 
aggiungere una define, dovrei andare a cercare tutti gli header di 
personalizzazione e definirla, true o false che sia. Altrimenti la volta 
dopo, se quella costante non c'è, potrebbe capitare come mi è successo 
di dimenticarmene.
Molto più semplice, almeno per come ho impostato il lavoro, trovarmi uno 
warning o un errore nel caso il preprocessore non trovi questa costante.
BQ

 ... cut ... 
E in effetti hai ragione: 
http://gcc.gnu.org/onlinedocs/cpp/If.html#If
In particolare:
"Identifiers that are not macros, which are all considered to be the number
zero. This allows you to write #if MACRO instead of #ifdef MACRO, if you know
that MACRO, when defined, will always have a nonzero value. Function-like macros
used without their function call parentheses are also treated as zero.
In some contexts this shortcut is undesirable. The -Wundef option causes GCC to
warn whenever it encounters an identifier which is not a macro in an `#if'. "
La differenza filologica consiste, quindi, nell'usare #if o #ifdef!

 
esatto!
ci ho elucubrato su nell'altra risposta! Grazie

 warning o un errore nel caso il preprocessore non trovi questa costante.
Comodo e bello! 

SilverLeo ha scritto:

in effetti lo trovo abbastanza comodo, soprattutto nel mio caso in cui 
devo fare molti progetti molto simili tra loro.