PDA

Visualizza la versione completa : [C] Utilizzo di macro per determinate librerie


frankitt
20-08-2009, 09:54
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!

shodan
20-08-2009, 11:12
Non si può fare quello che dici. Le direttive di preprocessing sono elaborate per prime, mentre l'if è eseguito a runtime.

frankitt
20-08-2009, 12:17
Ti ringrazio per la risposta! Ciao!

MItaly
21-08-2009, 11:43
Puoi spiegare meglio a cosa ti servirebbe una cosa del genere? Forse esiste una soluzione fattibile.

frankitt
21-08-2009, 20:35
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

MItaly
21-08-2009, 23:25
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


#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


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();
}
.

shodan
21-08-2009, 23:28
edit

shodan
21-08-2009, 23:52
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.


#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.

frankitt
25-08-2009, 20:41
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!

Loading