Visualizzazione dei risultati da 1 a 6 su 6
  1. #1
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177

    [C++] macro preprocessore

    Il problema è il seguente:

    sto lavorando ad esempio su un progetto, e mi trovo nella condizione di dover includere i seguenti tre <tipi> di file:

    file il cui indirizzo è conosciuto (ad esempio fstream, vector, ecc) in cui faccio #include <vector>
    file che sono nella cartella del main.cpp in cui faccio #include "nomedelfile"
    file che sono/saranno comuni a più progetti, che stanno nella cartella C:\Cartella1\Cartella2\Cartella3\Cartella4\nomefil e.h

    per i primi due tipi, l'include non dovrebbe mai cambiare, ma se per un qualsiasi motivo avessi la necessità di spostare i file di tipo 3, non è molto comodo cambiare l'indirizzo di ogni include.

    è possibile definire una macro in cui pongo una sola volta l'indirizzo, e poi metto solo il nome del file?

    una cosa del tipo che C:\Cartella1\Cartella2\Cartella3\Cartella4\ viene sostituito con CUSTOM_PATH e poi viene aggiunto il nome del file, che non cambierà?

    Qualche link a riguardo? Con ricerche del tipo "c++ indirizzo file macro" o similari, non riesco a trovare niente che mi torna utile, ho visto solo che esiste __FILE__, ma non dovrebbe tornare utile al mio caso.

    Grazie

  2. #2
    Utente di HTML.it L'avatar di oregon
    Registrato dal
    Jul 2005
    residenza
    Roma
    Messaggi
    36,480
    Puoi provare così

    codice:
    #define ST_(a) #a
    #define ST(a) ST_(a)
    #define MYPATH C:\\Cartella1\\Cartella2\\Cartella3\\Cartella4
    
    
    #define MYFILE prova.h
    #include ST(MYPATH\\MYFILE)
    No MP tecnici (non rispondo nemmeno!), usa il forum.

  3. #3
    Normalmente queste cose si sistemano a livello di sistema di build... in genere basta modificare le proprietà del progetto/una variabile nel Makefile/un qualcosa nel sistema di build che usi per aggiungere sulla linea di comando del compilatore l'opzione che gli dice dove andare a cercare gli include. Tieni comunque conto che condividere lo stesso source tree tra diversi progetti (potenzialmente compilati con opzioni differenti) può non essere banalissimo (e in ogni caso, o si tratta di librerie header-only o comunque devi inventarti qualche sistema per compilare al volo la tua copia della libreria e/o tenere buona una copia già compilata).
    Amaro C++, il gusto pieno dell'undefined behavior.

  4. #4
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Cercando meglio, ho trovato questo, in cui a un certo punto si dice
    -I dir
    Add the directory dir to the list of directories to be searched for header files. See Search Path. Directories named by -I are searched before the standard system include directories. If the directory dir is a standard system include directory, the option is ignored to ensure that the default search order for system directories and the special treatment of system headers are not defeated (see System Headers) . If dir begins with =, then the = will be replaced by the sysroot prefix; see --sysroot and -isysroot.
    che potrebbe fare al caso mio, però non ho ancora provato, così come non ho ancora provato quanto proposto da Oregon, perchè il messaggio di MItaly mi fa venire più di qualche dubbio, quindi vale la pena fermarsi e cercare di capire.

    Le premesse sono:
    1. non programmo per professione, ma solo per necessità, e a parte una infarinatura di programmazione avuta alle superiori e un corso di C all'università, tutto il resto è da autodidatta (per il resto intendo che sono arrivato a usare le classi, anche se in modo elementare, usare i puntatori, anche se quando li vedo impiegati in certi esempi li digerisco a fatica, limitata conoscenza e relativo uso della libreria Qt, tutto ovviamente in C++, anche se è scritto nel titolo);
    2. non ho mai usato impostazioni diverse da quelle di default del compilatore, nè tantomento risceo ad immaginare casi in cui questo sia necessario o auspicabile. Sono partito usando Code::Block come IDE, ora uso Qt Creator, e in entrambi dovrei aver sempre usato gcc (non chiedetemi la versione, che per quanto sopra, a me basta che la compilazione vada a buon fine, ottimizzazioni o altro a livello di compilatore, mi son sempre ben guardato dallo studiarmele);
    3. i file che vorrei condividere tra più progetti sono quelli che riguardano aspetti che dovrebbero tornare utili in tutti i programmi, ad esempio, la gestione delle unità di misura, è un aspetto comune a tutti i miei programmi, quindi vorrei che una modifica fatta al relativo file .h e .cpp, mi torni buona in automatico in tutti i progetti;
    4. riguardo all'uso di librerie sia statiche che dinamiche, non ho mai capito un bel niente, per ora oltre al file main.cpp, ho un certo numero di file .h e associato .cpp che includo nel progetto, una bella shakerata e salta fuori un file .exe. Attualmente uso Qt Creator, per il fatto che oltre alla gestione della GUI, scritto il codice una volta, è possibile compilarlo anche per altri sistemi operativi (sempre usato Windows, ma Linux ha una certa attrattiva...). Se dovessi passare all'uso di librerie, vorrei fosse possibile anche per queste.


    Chiedo quindi lumi (link, siti, documentazione, ecc.) su come gestire questa situazione, cioè se gestirla tramite impostazione di variabili al compilatore, oppure tramite librerie (non so perchè, ma così a naso, visto l'intervento di MItaly, credo sia la strada da percorrere)
    Grazie

  5. #5
    Utente di HTML.it L'avatar di Scara95
    Registrato dal
    Jul 2009
    residenza
    Zimella (VR)
    Messaggi
    2,589
    In qt creator basta aprire la configurazione del progetto.
    Resta comunque il fatto che devi averla precompilata.

    Una nota comunque: un cambio in una libreria portrebbe rompere tutto il codice che la utilizza, stai quindi molto attento.
    "Quid enim est, quod contra vim sine vi fieri possit?" - Cicerone, Ad Familiares

  6. #6
    Utente di HTML.it L'avatar di ing82
    Registrato dal
    Sep 2014
    Messaggi
    177
    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    In qt creator basta aprire la configurazione del progetto.
    Ok, approfondisco.


    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    ...
    Resta comunque il fatto che devi averla precompilata.
    ...
    Perdonami, ma è sottintesa la libreria? (che so che esistono, ma mai usate/create/compilate/linkate e quant'altro)

    Quote Originariamente inviata da Scara95 Visualizza il messaggio
    ...
    Una nota comunque: un cambio in una libreria portrebbe rompere tutto il codice che la utilizza, stai quindi molto attento.
    Da perfetto ignorante, non riesco a capire come possa accadere, o meglio, non mi sembra una cosa che possa passare così inosservata, faccio un esempio di quanto ho in testa:

    ho creato la libreria LIBRERIA (statica o dinamica non penso faccia differenza, ma ripeto, considerazione da ignorante) in cui è implementata la funzione
    tiporestituito FUNZIONE(parametro1, parametro2)

    Se lascio inalterati i parametri e il tipo restituito, posso cambiare come voglio l'implementazione della funzione, o c'è (molto?) altro?

    Grazie

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.