2013-03-15 6 views
7

Pracuję nad dużą jednostką, urządzenie stało się tak duże, że zdecydowałem się podzielić na 3 jednostki. Załóżmy, że te nazwy jednostek to: Main, Common i Objects. Jednostka Main wykorzystuje obie pozostałe jednostki, a jednostka Objects również używa jednostki Common. We wszystkich 3 jednostkach jest kod, który musi odnosić się do tych warunkowych.Czy mogę zdefiniować warunki warunkowe w jednostce i użyć ich w innych jednostkach?

Problem polega na tym, że niezależnie od tego, z której 3 jednostki zdefiniowałem te warunkowe, pozostałe 2 jednostki nie widzą ich. Na pewno nie chcę ich kopiować we wszystkich 3 jednostkach. Nie chcę też definiować ich w projekcie, ponieważ jednostki te będą wykorzystywane przez wiele projektów, w którym to przypadku wszystkie projekty korzystające z tego nie powinny przejmować się warunkami.

Czy mogę zdefiniować te warunki w taki sposób, aby wszystkie 3 jednostki je widziały, bez definiowania ich w projekcie?

+3

Możesz użyć pliku włączeń. – TLama

+0

+1. Nie rozumiem jednak sprzeciwu wobec umieszczania ich w pliku projektu. Jeśli tam jest, nie wpłynie to na żadne inne projekty korzystające z jednostek (o ile używają jednostek, a nie skompilowanych plików .dcu), ponieważ definicje w pliku projektu będą dotyczyły tylko projektu, w którym zdefiniowane są stosowane. Inne projekty korzystające z jednostek nie znałyby nic na temat definicji i kompilowałyby jednostki bez wpływu na cokolwiek. Umieszczenie ich w pliku włączającym sprawiłoby jednak, że inne projekty musiałyby odpowiednio zmienić plik włączający przed kompilacją. –

+0

@Ken, ponieważ niezależnie od tego, jaki projekt korzysta z tych jednostek, wszystkie projekty powinny przyjmować te same warunki i nie muszą się nimi martwić. Na przykład 10 różnych projektów prawdopodobnie potrzebowałoby tych samych warunków warunkowych. Ponadto, istnieje 12 warunków, które muszę zdefiniować, nie oczekuję, że twórca końcowy zdefiniuje wszystkie 12 z nich w projekcie, gdy nie mają powodu, aby wiedzieć, że te warunki istnieją. –

Odpowiedz

8

Jedyną opcją, dla definicji warunkowych, jest umieszczenie ich w pliku .inc, który następnie można umieścić we wszystkich trzech jednostkach.

Jednak kryteria warunkowe i $IFDEF nie są jedynym sposobem uzyskania kompilacji warunkowej. Można rozważyć użycie stałej boolowskiej zamiast warunkowej. Tak długo, jak jest to widoczne we wszystkich trzech jednostkach, można użyć wartości $IF zamiast $IFDEF.

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

Albo, począwszy XE3, można zakończyć {$IF} z {$ENDIF}.

Osobiście preferuję to ostatnie podejście, gdy próbuję kompilować warunkowo i nie chcę, aby warunek miał zasięg globalny.

+0

Wygląda na to, że to jedyne rozwiązanie, dzięki! –

+0

Podoba mi się podejście '{$ IF MyConstant}'. Czego zwykle używasz do 'MyConstant'? Przy okazji, dlaczego nie chcesz, aby Twoje warunki miały zasięg globalny? Innymi słowy: po prostu interesuje się tym, do czego używasz kompilacji warunkowej.Obecnie jestem na "no conditionals" na wszystkich ścieżkach, z wyjątkiem być może zapewnienia zgodności wersji kompilatora dla starszej wersji naszego oprogramowania. –

+0

@MarjanVenema Zazwyczaj jest to kod diagnostyczny/debugowania, którego nie możemy pozwolić sobie na kompilację do standardowej kompilacji z powodu problemów z wydajnością. Jak wiesz, dobrze jest nie mieszać się do plików projektu, a lokalne zmiany w kodzie źródłowym są mniej nieprzejrzyste. –

Powiązane problemy