2013-03-15 11 views
7

Sto lavorando su una grande unità, l'unità è diventata così grande che ho deciso di dividerla in 3 unità. Diciamo che questi nomi di unità sono Main, Common e Objects. L'unità Main utilizza entrambe le altre due unità e l'unità Objects utilizza anche l'unità Common. C'è un codice in tutte e 3 le unità che deve fare riferimento a questi condizionali.Posso definire condizionali in un'unità e usarli in altre unità?

Il problema è, indipendentemente da quale delle 3 unità definisco queste condizioni, le altre 2 non le vedono. Certamente non voglio copiarli in tutte e 3 le unità. Inoltre, non voglio definirli nel progetto, perché queste unità saranno utilizzate da più progetti, nel qual caso tutti i progetti che usano questo non dovrebbero preoccuparsi dei condizionali.

Posso definire questi condizionali in modo che tutte e 3 le unità li vedranno, senza definirli nel progetto?

+3

È possibile utilizzare un file di inclusione. – TLama

+0

+1. Non capisco l'obiezione a metterli nel file di progetto però. Se è lì, non influenzerebbe altri progetti che usano le unità (purché utilizzino le unità e non i file .dcu compilati), perché le definizioni nel file di progetto si applicano solo al progetto in cui definisce sono applicati. Altri progetti che usano le unità non saprebbero nulla delle definizioni, e compilerebbero le unità senza che esse influenzino nulla. Inserirli in un file di inclusione, tuttavia, a meno che gli altri progetti sapessero di modificare il file di inclusione in modo appropriato prima della compilazione. –

+0

@ Ken perché non importa quale progetto stia utilizzando queste unità, tutti i progetti dovrebbero assumere le stesse condizioni e non doversi preoccupare di loro. Ad esempio, 10 diversi progetti richiederebbero presumibilmente gli stessi esatti condizionali. Inoltre, ci sono 12 condizionali che devo definire, non mi aspetto che lo sviluppatore finale definisca tutti e 12 questi nel progetto quando non hanno motivo di sapere che questi condizionali esistono. –

risposta

8

L'unica opzione, per le definizioni condizionali, è di inserirli in un file .inc che viene quindi incluso in tutte e tre le unità.

Tuttavia, le definizioni condizionali e $IFDEF non sono l'unico modo per ottenere la compilazione condizionale. Potresti prendere in considerazione l'utilizzo di una costante booleana invece di una condizione. Fintanto che è visibile in tutte e tre le unità, è possibile utilizzare $IF anziché $IFDEF.

{$IF MyConstant} 
    .... 
{$IFEND} 

Oppure, a partire dal XE3, è possibile terminare la {$IF} con {$ENDIF}.

Personalmente tendo a preferire quest'ultimo approccio quando provo a compilare in modo condizionale e non voglio che la condizione abbia uno scopo globale.

+0

Sembra proprio che questa sia l'unica soluzione, grazie! –

+0

Mi piace l'approccio '{$ IF MyConstant}'. Cosa tendi ad usare per 'MyConstant'? A proposito, perché non vuoi che le tue condizioni abbiano uno scopo globale? In altre parole: semplicemente interessato a ciò per cui stai usando la compilazione condizionale.Attualmente sono su un "no condizionale" a tutti i percorsi, tranne forse assicurando la compatibilità della versione del compilatore per la versione precedente del nostro software. –

+0

@ MarjanVenema In genere è per il codice di diagnostica/debug che non possiamo permetterci di compilare in una build standard a causa di problemi di prestazioni. Come sai, è bello non interferire con i file di progetto e le modifiche locali nel codice sorgente sono meno opache. –

Problemi correlati