Questo sito utilizza cookies, anche di terze parti, per mostrare pubblicità e servizi in linea con il tuo account. Leggi l'informativa sui cookies.
Username: Password: oppure
C/C++ - [avr-gcc]Precompilazione header libreria
Forum - C/C++ - [avr-gcc]Precompilazione header libreria

Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 19:45
Sabato, 16/07/2016
Buonasera,
sto spulciando le reference del preprocessore di gcc con scarsi risultati.
Illustro il mio problema; ho una libreria generalizzata in C, passando alcuni paramenti in fase di compilazione posso ottenere versioni molto diverse. Dovrei alla fine della compilazione dover generare circa 6 versioni diverse della libreria generalizzata. Pensavo per una pubblicazione di suddividere la directory di output con una sottodirectory per ogni libreria, vorrei però oltre ad inserire il classico file .a, aggiungere l'header già preprocessato per quella libreria, dovranno essere quindi risolti tutti gli if legati a definizioni ma mantenuti i riferimenti a file da includere e i commenti, un esempio
Codice sorgente - presumibilmente C

  1. #pragma once
  2. #include <avr/io.h>
  3. //Questo è l'header file
  4.  
  5. #if AAA == 1
  6. float ab;//variabile ab
  7. #endif
  8. #if BBB == 1
  9. double bb;//variabile bb
  10. #endif


Passando come definizione al preprocessore AAA 1 mi aspetto di ottenere
Codice sorgente - presumibilmente C/C++

  1. #pragma once
  2. #include <avr/io.h>
  3. //Questo è l'header file
  4.  
  5. float ab;//variabile ab


Il primo problema che non riesco a risolvere è la non risoluzione dei file include. Conoscete qualche direttiva che impedisce a avr-gcc di includere file?
Vi ringrazio per l'attenzione.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 22:02
Lunedì, 18/07/2016
Secondo me è ragionevole che l'usee della libreria usi uno switch preprocessore per selezionare la libreria.
Altrimenti, invece di escludere gli header, ti consiglio di includerli con il classico -I

Ultima modifica effettuata da lumo il 18/07/2016 alle 22:03
PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 0:19
Martedì, 19/07/2016
Scusa lumo ma non credo di aver capito bene, oppure tu non hai capito me :)
Poter generare header precompilati mi permette di renderli leggibili, un header con if posizionati in punti troppo critici rende il lavoro complesso anche per l'ide che deve offrire un interazione in tempo reale.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 9:03
Martedì, 19/07/2016
Non penso che un IDE avrebbe problemi, comunque capisco quello che vuoi. Quello che non mi è chiaro è come sia possibile che l'inclusione non funzioni. Non penso sia bene ignorarlo, sempre che si possa fare.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 11:55
Martedì, 19/07/2016
No l'inclusione funziona, ed è proprio quello il problema, non vorrei che l'include sia risolto, in quanto mi ritroverei gli header di sistema dentro il mio header file, direi che sarebbe da evitare si si vuole rendere leggibile il file.
Non conosco i limiti degli if del preprocessore, credo che spaccare a meta un prototipo di una funzione per poter inserire argomenti opzionali non sia proibito, ma credo che metta non poco i bastoni fra le ruote al risolutore RT dei prototipi dell'IDE.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 14:36
Martedì, 19/07/2016
È fattibile. Non capisco le tue preoccupazioni riguardo l'IDE, comunque ti faccio un esempio con qt creator (ma tutti gli altri Ide c++ lo fanno): per gli header usa libclang con le direttive impostate nel file di progetto, espande tutte le direttive preprocessore e ottiene le dichiarazioni. Su kdevelop ricordo che addirittura si vede nel popup l'espansione quando si fa l'hover sopra una macro. Quindi il risolutore di prototipi funzionerà bene.
L'inclusione in effetti non si può evitare. Penso che ti serva un livello superiore alle macro, probabilmente qualcosa di simile a GNU autoconf/m4 che trovi su linux.

PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 15:05
Martedì, 19/07/2016
Faciamo un esempio, cosi forse riesco a farmi capire
Codice sorgente - presumibilmente C++

  1. void Example(example_t*,
  2. #ifdef VAL_A
  3.         int
  4. #endif
  5. #ifdef VAL_B
  6.         float, int
  7. #endif
  8.         );


L'IDE come dovrebbe interpretare la "firma" di Example, come (example_t*,int) o come (example_t*,float,int)
Capisco che il compilatore non avrà problemi, in fase di compilazione certamente VAL_A o VAL_B saranno definiti e risolti dal preprocessore, ma prima sono sicuro che l'IDE saprà identificare entrambe le firme e non segnarle come errore? Mi rendo conto che questo problema non sia determinante per il codice finale, ma vorrei rendere la libreria facilmente fruibile anche in fase di scrittura.

Ritornando alla tua risposta allora mi fido di te e posso dire che non esiste soluzione, potrei provare ad eliminare i file di inclusione dall'header file ma non vedo proprio come...


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote
Avatar
lumo (Member)
Expert


Messaggi: 413
Iscritto: 18/04/2010

Segnala al moderatore
Postato alle 22:07
Martedì, 19/07/2016
Testo quotato

Postato originariamente da Roby94:

Faciamo un esempio, cosi forse riesco a farmi capire
Codice sorgente - presumibilmente C++

  1. void Example(example_t*,
  2. #ifdef VAL_A
  3.         int
  4. #endif
  5. #ifdef VAL_B
  6.         float, int
  7. #endif
  8.         );


L'IDE come dovrebbe interpretare la "firma" di Example, come (example_t*,int) o come (example_t*,float,int)


Se l'IDE  ha un file di progetto dove specifichi tra le opzioni del compilatore VAL_A e VAL_B, in genere è capace di generare la firma corretta.
Altrimenti dovrebbe funzionare definendo VAL_A o VAL_B nel sorgente prima di includerlo, ma dubito che un IDE che sappia fare questo non sappia fare la prima cosa.

Testo quotato

Ritornando alla tua risposta allora mi fido di te e posso dire che non esiste soluzione, potrei provare ad eliminare i file di inclusione dall'header file ma non vedo proprio come...


Puoi usare un ifdef attorno al #include.

Comunque la sensazione che provo vedendo il modo in cui vuoi procedere è che non sia il preprocessore C quello che vuoi.
Penso che la cosa più vicina sia autoconf, per intenderci quello che parte quando dai ./configure in un progetto.
Purtroppo sono tool considerati un po' ostici. Dovresti scrivere un file header.h.in che viene processato, in modo che autoconf sputi fuori la versione adatta.
Puoi trovare qualcosa qui:
http://www.gnu.org/software/autoconf/manual/autoconf.html# ...


PM Quote
Avatar
Roby94 (Member)
Guru


Messaggi: 1127
Iscritto: 28/12/2009

Segnala al moderatore
Postato alle 16:02
Mercoledì, 20/07/2016
eh lumo, hai ragione, io speravo di potermela cavare con il solo preprocessore, volevo evitare di ripiegare su sistemi non standardizzati, e va bhe, vorrà dire che non avrò l'ordine che desidero, mi metterò l'anima in pace. Grazie mille per l'attenzione lumo.


La programmazione è arte... fa che i tuoi script siano degni di un museo.
PM Quote