Proszę o wytłumaczenie mi dyrektyw z C++

0

Mam pytanie dotyczące przykładu zawartego na stronie:
http://www.bascom.dxp.pl/bascom_dyrektywy_preprocesora.htm
Może ktoś mi wytłumaczyć, i podać jakiś lepszy przykład zastosowania dyrektyw?
Bo jak na razie to według mnie nie potrzebne to jest do niczego.
Przecież podobnie można by zrobić ze zwykłą instrukcją if else. Po co to komu?
Po co te wszystkie dyrektywy? #define, #if itd.?
Ewentualnie jak z zewnętrznego pliku wysłać wynik zwrócony, do tego const, albo #define?

1

Dyrektywy preprocesora działają w czasie kompilacji.
Powiedzmy program ma działać pod linuksem oraz pod windowsami:

  • ustawiasz za pomocą #define że teraz kompilujesz pod windows i dostajesz EXE pod windows
  • ustawiasz za pomocą #define że teraz kompilujesz pod linuks i dostajesz plik wykonywalny pod linuks.
    Nie ma żadnego sensu trzymać w exe coś co jest potrzebne tylko pod linux kiedy exe i tak pod linuksem nie odpalisz.
0

a jak napisać np. taki programik sprawdzający system? Przecież do tego musi być chyba jeszcze jakiś zewnętrzny plik, który to sprawdzi i prześle jakoś wynik do pliku z dyrektywami.

1

define służy do definiowania przeróżnych tzw. makr, tz. coś jak inline, czyli będzie to wsadzane żywcem w miejscu użycia.

#define N 1000

to jest po prostu stała N, np. rozmiar tablicy, albo coś tam... co używasz tak:

int t[N];
for(int i = 0; i < N; i++) t[i] = rand();

A teraz zabawna operacja rewersji bitów w liczbie:

#define rev2(b) (b==1) ? 2 : (b==2) ? 1 : b
#define rev4(v) rev2(v >> 2) | (rev2(v & 0x3) << 2)
#define rev8(v) rev4(v >> 4) | (rev4(v & 0xF) << 4)
#define rev16(v) rev8(v >> 8) | (rev8(v & 0xFF) << 8)
#define rev32(v) rev16(v >> 16) | (rev16(v & 0xFFFF) << 16)

I teraz użyjesz to gdzieś np. tak:

rev = rev32(n);

a kompilator wygeneruje z 10KB kodu w miejsce tej jednej linii. :)

dodałem <code class="cpp">, bo define wiadomo jak wychodzi - msm

0

Dyrektywy preprocesora używane są w czasie prekompilacji.
Preprocesor można traktować jako dodatkowe narzędzie które wykonuje jakieś operacje na programie nie rozumiejąc jego struktury (a tylko swoje makra).
Jest to zaszłość z języka C i w C++ się od tego odchodzi.
Jedyne co musi być używane to "include guard": http://en.wikipedia.org/wiki/Include_guard

Tu masz szerszy opis dyrektyw: http://www.cplusplus.com/doc/tutorial/preprocessor/

0
#ifdef WIN32

// tutaj jest kod specyficzny dla Windowsa, który zostanie
// pominięty pod innymi systemami

#endif

1 użytkowników online, w tym zalogowanych: 0, gości: 1