Visualizzazione dei risultati da 1 a 9 su 9
  1. #1

    [c] Utilizzo di Macro per determinate librerie

    Salve ragazzi, un saluto a tutti quanti!
    Vi scrivo per chiedervi se sia possibile con un parametro passato in input includere una o l' altra libreria. Intendo qualcosa del genere:

    if(n==0) #include "a.h"
    else #include "b.h"

    Si può utilizzare qualche macro? Purtroppo non riesco ad inventarmi nulla che mi permetta di fare questo.
    Grazie in anticipo. e mi scuso se non risponderò subito ma non ho internet a casa!

  2. #2
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    Non si può fare quello che dici. Le direttive di preprocessing sono elaborate per prime, mentre l'if è eseguito a runtime.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  3. #3
    Ti ringrazio per la risposta! Ciao!

  4. #4
    Puoi spiegare meglio a cosa ti servirebbe una cosa del genere? Forse esiste una soluzione fattibile.
    Amaro C++, il gusto pieno dell'undefined behavior.

  5. #5
    scusami se ti risp solo ora,ma sto facendo scrivere questa risposta alla mia ragazza telefonicamente sotto dettatura!cercherò di spiegarti nel migliore dei modi visto che non mi è possibile scrivere personalmente pezzi di codice! io sto facendo un progetto in cui devo lavorare con due tipi di struct diversi,e quindi devo avere diciamo due contatori a queste strutture e devo avere un'altra struttura con all'interno due puntatori a questi tipi di struct!quindi nella maniera più semplice ogni volta devo controllare quale tipo di struttura è allocata,perchè una esclude l'altra!quindi io ho due librerie per entrambe le strutture!quindi io all'inizio del programma includo entrambe le librerie!il problema è che quindi nn posso usare in queste 2 librerie lo stesso nome sia per lo struct che per le funzioni,bensì chiamarle in maniera diversa!se invece io riuscissi all'interno del main a includere o l'una o l'altra in base all'input di cui parlavo prima,posso tranquillamente usare all'interno delle librerie lo stesso nome anche se sono oggetti diversi!tutto questo per avere un codice più chiaro e leggibile ed evitare continui controlli sui tpi di oggetti allocati: quindi anzicchè fare ogni volta per esempio
    if(ptr_a != null) funzione_a
    else funzione_b
    se ho un'unica libreria posso evitare tutti questi controlli

  6. #6
    Potresti emulare in C i metodi virtuali C++ inventandoti una specie di vtable da inserire nelle strutture, ossia dei puntatori a funzione contenuti in ogni struttura (inizializzati quando la struttura viene creata) che le funzioni generiche vanno a richiamare quando sono chiamate; in alternativa puoi risolvere la questione con delle macro, tipo
    codice:
    #define funzione(struttura, parametro1, parametro2) if(struttura.membroCheLaIdentifica==valoreMagico) funzione_1(struttura,parametro1,parametro2) else funzione(struttura, parametro1, parametro2)
    .
    La cosa più saggia a mio avviso resta comunque passare al C++ dove questi problemi sono facilmente risolti con i metodi virtuali
    codice:
    class ClasseBase
    {
        /* bla bla bla */
    public:
        virtual void metodo1() = 0;
    }
    
    class Derivata1 : public ClasseBase
    {
        /* bla bla bla */
    public:
        virtual void metodo1();
    }
    
    class Derivata2 : public ClasseBase
    {
        /* bla bla bla */
    public:
        virtual void metodo1();
    }
    
    Derivata1::metodo1()
    {
        /* implementazione specifica per Derivata1 */
    }
    
    Derivata2::metodo1()
    {
        /* implementazione specifica per Derivata2 */
    }
    
    /* Una funzione che ha un generico puntatore a ClasseBase
    e richiama metodo1 richiamerà automaticamente la versione corretta */
    void funzioneInutile(ClasseBase * cb)
    {
        cb->metodo1();
    }
    .
    Amaro C++, il gusto pieno dell'undefined behavior.

  7. #7
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    edit
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  8. #8
    Utente di HTML.it L'avatar di shodan
    Registrato dal
    Jun 2001
    Messaggi
    2,381
    il problema è che quindi nn posso usare in queste 2 librerie lo stesso nome sia per lo struct che per le funzioni,bensì chiamarle in maniera diversa!se invece io riuscissi all'interno del main a includere o l'una o l'altra in base all'input di cui parlavo prima,posso tranquillamente usare all'interno delle librerie lo stesso nome anche se sono oggetti diversi!
    Puoi farlo ma solo a livello di preprocessing.
    codice:
    #ifdef QUALCOSA__
    #include "a.h"
    #else
    #include "b.h"
    #endif
    Questo significa che per cambiare struct devi definire o indefinire la macro e ricompilare.
    Ovviamente è necessario SOLO se hai collisioni di nomi.
    This code and information is provided "as is" without warranty of any kind, either expressed
    or implied, including but not limited to the implied warranties of merchantability and/or
    fitness for a particular purpose.

  9. #9
    Ragazzi vi ringrazio per le risposte...proprio ora le ho lette...Purtroppo il progetto è in c, e il fatto di eseguire o l' una o l' altra funzione dipende da un parametro passato durante l' avvio...per intenterci, da riga di comando, se faccio ./start -a faccio una cosa, start -b ne faccio un altra...Non so per esempio come potrei utilizzare la soluzione di shodan in questo caso...Per quanto riguarda la prima soluzione di Mitaly penso sia l' unica che a questo punto io possa utilizzare...ora ne parlerò con il mio gruppo di amici con i quali sto facendo questo progetto universitario.
    Io davvero ragazzi vi ringrazio moltissimo...nel caso abbia dei dubbi non esiterò a chiederveli, sfruttando ancora la vostra gentilezza.
    Davvero mille grazie!
    A presto!

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.