2010-03-24 18 views
5

Mam następujący fragment kodu:C++ kompilacja warunkowa

#ifdef DO_LOG 
#define log(p) record(p) 
#else 
#define log(p) 
#endif 

void record(char *data){ 
..... 
..... 
} 

Teraz jeśli zadzwonię log("hello world") w moim kodu i DO_LOG nie jest zdefiniowana, będzie linia zostać skompilowany, innymi słowy będzie to jeść pamięć dla ciągu "hello world"?

P.S. W programie jest wiele wywołań nagrywania i jest on wrażliwy na pamięć, więc czy istnieje inny sposób kompilacji warunkowej, który zależy tylko od #define DO_LOG?

+2

Nie powinieneś zaimplementować własnej biblioteki logowania. Jest ich dość. Oto, czego używam: http://www.templog.org. – sbi

+2

@sbi Nie wiem. Napisałem swój własny i działa pięknie. To najlepszy sposób, aby dowiedzieć się, jak coś zrobić. :-) – Konrad

+1

@Konrad: Tak też zrobiłem, ale ciężko jest być lepszym od zgromadzonej mądrości ustalonej biblioteki. – sbi

Odpowiedz

14

To powinno być trywialne, aby sprawdzić dla siebie, sprawdzając wynikowy plik binarny.

Powiedziałbym "nie", ponieważ wyrażenie całkowicie zniknie, kompilator nigdy nie zobaczy łańcucha (jest usunięty przez makro makr preprocesora).

+1

To się zgadza. Napisanie programu do weryfikacji zajęło mi 30 sekund. –

+2

@unwind & @Neil: Byłbym zainteresowany, w jaki sposób zweryfikowaliście, że obserwowane zachowanie nie jest tylko cechą szczególną kompilatora. – sbi

+0

@sbi: Nie zrobiłem, chętnie się przyznam. Myślę, że logika, której używam w mojej odpowiedzi, brzmi dobrze; makro preprocesora musi działać tak, jak zdefiniowano, tzn. literał łańcuchowy znika ze źródła. Jeśli nie masz racji, z przyjemnością powiem, że możesz zacytować standardy. – unwind

4

Ponieważ preprocesor działa przed kompilatorem, wiersz nie będzie istniał nawet podczas pracy kompilatora. Tak więc odpowiedź brzmi: nie, w ogóle nie korzysta z żadnej pamięci.

4

Nie, nie będzie w pliku binarnym. Nie zostanie nawet skompilowany - preprocesor rozszerzy go na pusty ciąg przed kompilacją, więc kompilator nawet go nie zobaczy.

2

Nie. Preprocesor jest wykonywany przed kompilacją, więc kod nigdy nie będzie widoczny. Chciałbym jednak dodać, że jeśli interesuje cię dodanie logowania do aplikacji C++, możesz użyć biblioteki Log4Cxx. Używa podobnych makr, które można całkowicie usunąć z aplikacji, ale gdy logowanie jest włączone, obsługuje kilka różnych poziomów rejestrowania (na podstawie ważności/ważności), a także wielu różnych "aplikantów", do których wysyłane są wyniki logowania (np. Syslog , konsola, pliki, sieciowe wejścia/wyjścia itp.).

Pełną dokumentację interfejsu API można znaleźć pod adresem Log4Cxx API docs. Ponadto, jeśli na pokładzie są jacyś deweloperzy Javy, którzy używają Log4J, powinni czuć się jak u siebie w domu przy pomocy Log4Cxx (i przekonać Cię, aby go użyć).