Oppure

Loading
16/07/16 17:45
Roby94
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
#pragma once
#include <avr/io.h>
//Questo è l'header file

#if AAA == 1
float ab;//variabile ab
#endif
#if BBB == 1
double bb;//variabile bb
#endif

Passando come definizione al preprocessore AAA 1 mi aspetto di ottenere
#pragma once
#include <avr/io.h>
//Questo è l'header file

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.
aaa
18/07/16 20:02
lumo
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 18/07/16 20:03
aaa
18/07/16 22:19
Roby94
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.
aaa
19/07/16 7:03
lumo
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.
aaa
19/07/16 9:55
Roby94
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.
aaa
19/07/16 12:36
lumo
È 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.
aaa
19/07/16 13:05
Roby94
Faciamo un esempio, cosi forse riesco a farmi capire
void Example(example_t*,
#ifdef VAL_A
	int
#endif
#ifdef VAL_B
	float, int
#endif
	);

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...
aaa
19/07/16 20:07
lumo
Postato originariamente da Roby94:

Faciamo un esempio, cosi forse riesco a farmi capire
void Example(example_t*,
#ifdef VAL_A
	int
#endif
#ifdef VAL_B
	float, int
#endif
	);

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.

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:
gnu.org/software/autoconf/manual/…

aaa