Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: Makra w C++

Zdaje sobie sprawę że makro to w zasadzie pozostałość po C, ale zastanawiam się ilu z was korzysta z makroinstrukcji?

Piszę sobie coś na wzór RSSReadera i w pewnym momencie przydało mi się takie coś:

#define LOAD(NAME) if(strcmp(node->Value(),#NAME) == 0) { NAME = std::string(node->FirstChild()->ToText()->Value()); }
LOAD(title)
LOAD(link)
LOAD(description)
//i jeszcze trochę rzeczy niżej

Jak widać przyspieszyło trochę pracę i czytelność :-)

Może ma ktoś jakieś ciekawe zastosowania makr w zanadrzu?Jerzy Mieczyński edytował(a) ten post dnia 27.06.09 o godzinie 23:10

konto usunięte

Temat: Makra w C++

Ja mam dość ambiwalentny stosunek co do stosowania makroinstrukcji. Ani to nie sprawdza typów wprowadzanych danych, ani nie wygląda ładnie... a podczas debugowania faktycznych nazw makra nie widać, przez co czasem nie wiadomo, z czym ma się doczynienia (ale to głównie w stosunku do stosowania stałych jako #define-ów).

Jeśli już stosuję makra, to czasem np do czegoś takiego (gdy mam do czynienia z singletonem):


#define Manager ManagerNamespace::DataManager::getInstance()


Dzięki temu unikam pisania przy pobieraniu instancji. Jakiś czas stosowałem #define-y właśnie do definiowania stałych... ale szybko stwierdziłem, że lepsze do tego jest słowo kluczowe 'const'.Krzysztof Kondrak edytował(a) ten post dnia 28.06.09 o godzinie 00:28

konto usunięte

Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: Makra w C++

Zawsze co prawda mogłem przesyłać referencje do zmiennej, adres TiXmlNode i sam tekst z którym mam porównywać. Ale jednak wolałem to zrobić w ten sposób będąc pewnym pewnego ryzyka - ale je niweluje nieco fakt trzymania makra przy jego użyciu - tzn. jakbym przykładowo źle wpisał 'Title' i zobaczył bym błąd 'Title is not member of RSS' (czy jakoś tak) to bym od razu załapał w czym problem.

Temat: Makra w C++

Piotr Likus:
LOAD()
A dlaczego nie funkcja inline?

Stałe
http://www.comeaucomputing.com/techtalk/#definevsconst
http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cp...
F-kcja inline nie uzyskasz nazwy zmiennej jako "char*". Makr preprocesora uzywam aktualnie glownie wlasnie w celach podobnych, czyli generowania kodu (rzadko, bo rzadko, ale potrafi sie przydac).
Tomasz Kaczanowski

Tomasz Kaczanowski Ot, programista

Temat: Makra w C++

Maciej Siniło:
Piotr Likus:
LOAD()
A dlaczego nie funkcja inline?

Stałe
http://www.comeaucomputing.com/techtalk/#definevsconst
http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cp...
F-kcja inline nie uzyskasz nazwy zmiennej jako "char*". Makr preprocesora uzywam aktualnie glownie wlasnie w celach podobnych, czyli generowania kodu (rzadko, bo rzadko, ale potrafi sie przydac).

Jeśli piszę w C++ wolę wtedy (jeśli to nie jest zbyt karkołomne) użyc template. Nie blokuję sobie przynajmniej przestrzeni nazw.
Jakub L.

Jakub L. Programista

Temat: Makra w C++

W makrze można zrzucić __FILE__ i __LINE__ do loga, kombinowanie tego samego z funkcją inline jest bardziej upierdliwe.
A przydaje się toto przy na przykład zgrubnym śledzeniu pamięci.
Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: Makra w C++

Kiedyś w ciekawy sposób sobie zliczałem ilość użyć new i delete - używając do tego makr, ale to zdaje się można było zrobić w ładniejszy sposób (jednak spisało się całkiem dobrze w małym projekcie)

Co do template to się zgodzę że lepiej użyć ich w większości przypadków, ale jak widać miejsce dla makr też się czasem znajdzie.

//Edit:
Właśnie, przypomniało mi się że bodajże w unreal tournament programiści masę kodu wstawili w #define z __LINE__ i __FILE__ które wyskakiwało w momencie jakiegoś błędu (razem z kodem).Jerzy Mieczyński edytował(a) ten post dnia 28.06.09 o godzinie 18:31

Temat: Makra w C++

Tomasz Kaczanowski:
Maciej Siniło:
Piotr Likus:
LOAD()
A dlaczego nie funkcja inline?

Stałe
http://www.comeaucomputing.com/techtalk/#definevsconst
http://coding.derkeiler.com/Archive/C_CPP/comp.lang.cp...
F-kcja inline nie uzyskasz nazwy zmiennej jako "char*". Makr preprocesora uzywam aktualnie glownie wlasnie w celach podobnych, czyli generowania kodu (rzadko, bo rzadko, ale potrafi sie przydac).

Jeśli piszę w C++ wolę wtedy (jeśli to nie jest zbyt karkołomne) użyc template. Nie blokuję sobie przynajmniej przestrzeni nazw.
Zgoda, ale w przypadku podanym przez autora watku szablon niewiele pomoze. Preprocesor ma pewne mozliwosci, ktorych nie da sie zastapic i tyle. Makra to narzedzie jak kazde inne.
Szymon Kubisiak

Szymon Kubisiak Developer aplikacji
mobilnych Android

Temat: Makra w C++

Nieustannie używam masy makr. Podstawowe to
SAFE_DELETE(p) if(p){delete p;p=NULL;}.
Niezbędne do logowania:
#ifdef _LOGGER_
#define LOG(args...) g_Log->DoLog(__FILE__, __LINE__, args)
#else
#define LOG(args...)
#endif

Jak też do generowania powtarzającego się kodu, choćby w funkcyjkach typu enum2string przecież nie będę powtarzał case ECośtam: return L"ECośtam";

Stąd też dużo używam #undef, bo większość makr jest użyteczna tylko przez kilka(naście) linii.

Podobnie gdy trzeba jakąś listę czegoś w jednym miejscu zdefiniować a w innym zainicjalizować, można to zrobić wygodnie makrem w makrze - jedno główne globalne jest listą a w miejscach gdzie ma się znaleźć prawdziwy kod definiuje się lokalne makra wykonujące tą listę. Idealne np. do fabryk klas, eliminuje pomyłki niedopilnowania jednego z kroków.

konto usunięte

Temat: Makra w C++

Szymon Kubisiak:
Nieustannie używam masy makr. Podstawowe to
SAFE_DELETE(p) if(p){delete p;p=NULL;}.

Ten IF akurat nie ma sensu. Teoria tak przynajmniej mówi.
http://faqs.cs.uu.nl/na-dir/C++-faq/part08.html
(patrz pkt. 16.7)

A więc raczej:
SAFE_DELETE(p) {delete p; p=NULL;}
Piotr Likus edytował(a) ten post dnia 29.06.09 o godzinie 20:42
Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: Makra w C++

Chyba chodziło o to żeby przez przypadek nie wywalić czegoś co już nie istnieje.
Szymon Kubisiak

Szymon Kubisiak Developer aplikacji
mobilnych Android

Temat: Makra w C++

Piotr Likus:
Szymon Kubisiak:
SAFE_DELETE(p) if(p){delete p;p=NULL;}.

Ten IF akurat nie ma sensu. Teoria tak przynajmniej mówi.

Teoretycznie tak (delete samo sprawdza NULLa). Czasem jednak się new i delete przedefiniowywuje na jakiś memory checker.
To bardziej zaszłość z mojej strony, tak było w headerach Windows więc nie zmieniałem.

W każdym razie to jest właśnie piękno makr : naprawić/zoptymalizować problem wszystkich deletów można w jednym miejscu : )Szymon Kubisiak edytował(a) ten post dnia 29.06.09 o godzinie 21:02
Artur Kęska

Artur Kęska Senior Software
Developer, XNet
Communications

Temat: Makra w C++

Szymon Kubisiak:
W każdym razie to jest właśnie piękno makr : naprawić/zoptymalizować problem wszystkich deletów można w jednym miejscu : )

To jest piękno dobrego design'u i stosowania logicznych reguł - nie makr ;-) .Artur Kęska edytował(a) ten post dnia 30.06.09 o godzinie 09:58
Piotr P.

Piotr P. Software Developer

Temat: Makra w C++

Jerzy Mieczyński:
Zdaje sobie sprawę że makro to w zasadzie pozostałość po C,

Pozostałość czy "pozostałość"? Prawie w ogóle nie piszę w C++, ale nie wyobrażam sobie C bez makr. Różnica między makrem a funkcją jest na tyle zasadnicza, że rozważanie czy wykorzystywać makra jest bez sensu IMO.
Może ma ktoś jakieś ciekawe zastosowania makr w zanadrzu?

Banalny przykład wykorzystania makr:

http://trac.midgard-project.org/browser/trunk/midgard/...
Jerzy M.

Jerzy M. C#/JavaScript
Developer

Temat: Makra w C++

Piotr P.:
Jerzy Mieczyński:
Zdaje sobie sprawę że makro to w zasadzie pozostałość po C,

Pozostałość czy "pozostałość"? Prawie w ogóle nie piszę w C++, ale nie wyobrażam sobie C bez makr. Różnica między makrem a funkcją jest na tyle zasadnicza, że rozważanie czy wykorzystywać makra jest bez sensu IMO.
Może ma ktoś jakieś ciekawe zastosowania makr w zanadrzu?

Banalny przykład wykorzystania makr:

http://trac.midgard-project.org/browser/trunk/midgard/...

Coś czego chciano się pozbyć, ale nie potrafiono. [Albo wnieść na wyższy poziom zastępując czymś innym (szablon, stała)]
Może faktycznie źle dobrałem słowo.Jerzy Mieczyński edytował(a) ten post dnia 05.07.09 o godzinie 12:06

Temat: Makra w C++

Ja lubie stale stringi pakowac w #define zamiast w static const char*.
Potem moge sobie uzyc sizeof() zamiast strlen().
Artur Kęska

Artur Kęska Senior Software
Developer, XNet
Communications

Temat: Makra w C++

Rafał Ciepiela:
Ja lubie stale stringi pakowac w #define zamiast w static const char*.
Potem moge sobie uzyc sizeof() zamiast strlen().


{
static const char constData[] = "1234567890";

printf("size of literal = %d\n",sizeof("1234567890"));
printf("size of const array = %d\n",sizeof(constData));
}


Wynik:


size of literal = 11
size of const array = 11


kompilator VC 2005 oraz mingw (Qt SDK win32).

Makra są czasem OK, ale z dużym naciskiem na czasem.

Kiedy jest to czasem:
a. gdy nie da się inaczej uniknąć odejścia od DRY (i to też nie za wszelką cenę).
b. gdy inaczej się nie da zoptymalizować kodu pod względem wydajności.
c. ... hmm, nic mi teraz nie przychodzi do głowy.

Następna dyskusja:

Excel 2013 - przypisanie ma...




Wyślij zaproszenie do