Jeśli jesteś właścicielem tej strony, możesz wyłączyć reklamę poniżej zmieniając pakiet na PRO lub VIP w panelu naszego hostingu już od 4zł!

Kilka słów o makrach w C i C++

Po całym tygodniu programowania w pracy i w domu, dziś w ramach relaksu proponuje krótki tekst o makrach.

Znany jestem z tego, że  niezbyt lubię makra w C++, ponieważ maja one wiele wad.  Najbardziej doskwierająca to zabieranie przestrzeni nazw. Ale niektóre makra okazują sie być przydatne. Toteż chciałbym Państwu przedstawić kilka z najczęściej przeze mnie używanych.

 

Pomijam tutaj najbardziej oczywiste czyli #include, czy też #ifdef, bo ich użyteczności nigdy nie kwestionowałem. I makro:

#ifdef __MORPHOS__
...
#else
...
#endif

używane jest przeze mnie dość często przy przystosowywaniu róznych obcych bibliotek, do tego by działały bardziej wydajnie pod Morphosem. 

 

Drugie pole ekspoatacji makr, to użycie __DATE__.  Często tworząc program, szczególnie gdy wysyłamy je różnym testerom, jestesmy narażeni na to, że oni wyłapują błedy, które juz poprawiliśmy w nowszej wersji, ale z jakichś powodów nowa wersja programu nie dotarła do osoby testującej. Zignorowanie każdego zgłoszenia nie jest najlepszym pomysłem, bo może się okazać, że niezbyt dobrze poprawilismy ten błąd. Dlatego warto mieć informację od testera, którą wersję programu używa. Wiadomo, ze w nawale pracy moze nam się zdarzyć, że nie zmienimy numeru rewizji. Ale jest i na to sposób. Automatyczne zapamiętanie w pliku wykonywalnym daty kompilacji. Do tego  właśnie celu warto użyć makra __DATE__. A oto przykładowy fragment kodu, gdzie śmiało możemy taką informację dodać:

 

app = (Object *)NewObject(cl->mcc_Class, 0,
        MUIA_Application_Author, (IPTR)"Tomasz Kaczanowski",
        MUIA_Application_Base, (IPTR)"2b_superprogram",
        MUIA_Application_Copyright, (IPTR)"(c) 2012 Tomasz Kaczanowski",
        MUIA_Application_Description, (IPTR)"Wszystkomający superprogram",
        MUIA_Application_Title, (IPTR)"Superprogram",
MUIA_Application_Version, (IPTR)"$VER: Superprogram "_VER_" ("__DATE__")",
                    MUIA_Application_Window, (IPTR)win,
        TAG_END);

 

Makra przydają się również przy szukaniu błędów. Czasami mamy podejrzenia, że coś się dzieje nie tak, albo funkcja wykonywana jest z niewłaściwymi parametrami. Zdarza się, że błąd pojawia się tylko u któregoś z testerów i winna jest temu jakas biblioteka w innej wersji, niż ta, którą my posiadamy. Przyda się nam wtedy informacja, gdzie program działa niewłaściwie. Więc poza datą kompilacji, przyda nam się informacja, gdzie program zadziałał niewłaściwie. Na te okoliczności posiadam makro:

 

#define LogError(p) kprintf("%s: %s:%s:%d\n", (#p), __FILE__, __FUNCTION__, __LINE__)

 

Wywołane poda nam informacje, które pomogą zidentyfikować problem, oraz namiary, w którym pliku, w której funkcji, w której linii zostało makro wywołane. A oto sposób wywołania:

 

if (zmienna == 0)
        LogError("To nie powinno się wydażyć! zmienna == 0!");

 

 

Ponieważ ten krótki tekst powstał w niedzielę, zatem pozdrawiam wszystkich niedzielnych klepaczy kodu! :)   

Zapraszam też do lektury innych artykułów o tematyce programistycznej. Ze względów organizacyjnych postanowiłem zamieszczać je na innej stronie. Pojawił się na tej nowej stronie krótki tekst poszerzający tu zamieszczoną wiedzę o makrach.