Forum » Programiranje » [visual c++] #ifdef _DEBUG
[visual c++] #ifdef _DEBUG
fogl ::
Kaj pomeni koda, ki jo visual c++ posatvi v vsak .cpp fajl:
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Pri prevajanju mi je ven metal ene čudne errorje, ki mi niso bli jasni od kod, potem pa sem zbrisal ta del kode, je blo pa vse ok...
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
Pri prevajanju mi je ven metal ene čudne errorje, ki mi niso bli jasni od kod, potem pa sem zbrisal ta del kode, je blo pa vse ok...
lp, klemen
Vesoljc ::
komande ki se začnejo z # so takoimenovani preprocesor-ski ukazi. namreč, preden se prevajalnik loti prevajanja kode, izvede nad njo še en "tekstni masaker" (makroti).
recimo:
ko preprocesor obavi svoje delo, koda izgleda tako:
to pa je pogojni stavek za preprocesor, le-ta se izvede samo enkrat ob prevjajanju (compile time) in ne vedno tako kot navaden if stavaek (run time).
za tvoj primer pa gre to nekako tako: ko nastaviš debug konfiguracijo v VC-ju, se prevajalniku poda parameter _DEBUG (ali DEBUG), kar je isto kot da bi rekli:
prva vrstica torej preveri, če je omenjeni "izraz" definiran, vkolikor je, operatorju new "pripišemo" vrednost DEBUG_NEW. čemu? hja, verjetno ima tale DEBUG_NEW vgrajeno funkcionalnost, ki ti omogoča spremljanje, kaj za vraga se dogaja s pomnilnikom, ko uporabljaš new/delete. undef preprosto "ugasne" nek izraz:
__FILE__ je predefirniran makro, ki ti ob prevajanju vrne ime datoteke, v kateri se nahaja. static char [] pa preprosto naredi char polje, tako da to lahko uporabis kar znotraj programa:
zelo uporabno pri izpisu napak...
endif pa le konča zgoraj začeti if stavek...
go google za "c++ macro", "c++ preprocessor", itd...
recimo
recimo:
#define velikost 100 int polje[velikost];
ko preprocesor obavi svoje delo, koda izgleda tako:
int polje[100];
#ifdef #endif
to pa je pogojni stavek za preprocesor, le-ta se izvede samo enkrat ob prevjajanju (compile time) in ne vedno tako kot navaden if stavaek (run time).
za tvoj primer pa gre to nekako tako: ko nastaviš debug konfiguracijo v VC-ju, se prevajalniku poda parameter _DEBUG (ali DEBUG), kar je isto kot da bi rekli:
#define _DEBUG
prva vrstica torej preveri, če je omenjeni "izraz" definiran, vkolikor je, operatorju new "pripišemo" vrednost DEBUG_NEW. čemu? hja, verjetno ima tale DEBUG_NEW vgrajeno funkcionalnost, ki ti omogoča spremljanje, kaj za vraga se dogaja s pomnilnikom, ko uporabljaš new/delete. undef preprosto "ugasne" nek izraz:
#define BLAK #ifdef BLAK // koda tu notri se bo izvedla #endif #undef BLAK #ifdef BLAK // koda tu notri se ne bo izvedla #endif
static char THIS_FILE[] = __FILE__;
__FILE__ je predefirniran makro, ki ti ob prevajanju vrne ime datoteke, v kateri se nahaja. static char [] pa preprosto naredi char polje, tako da to lahko uporabis kar znotraj programa:
#include <iostream> #include <stdlib.h> using namespace std; static char THIS_FILE[] = __FILE__; int main(int argc, char *argv[]) { cout << THIS_FILE << endl; system("PAUSE"); return 0; }
zelo uporabno pri izpisu napak...
endif pa le konča zgoraj začeti if stavek...
go google za "c++ macro", "c++ preprocessor", itd...
recimo
Abnormal behavior of abnormal brain makes me normal...
Zgodovina sprememb…
- spremenil: Vesoljc ()
fogl ::
Ampak še vedno mi pa ni jasno, zakaj bi bil lahko ta del kode vzrok za napake ki mi jih je javljal?
lp, klemen
Vesoljc ::
ob čudnih težavah najprej probaj rebuild
Abnormal behavior of abnormal brain makes me normal...
Vredno ogleda ...
Tema | Ogledi | Zadnje sporočilo | |
---|---|---|---|
Tema | Ogledi | Zadnje sporočilo | |
» | [baze] Povezava do slike ali BLOB?Oddelek: Programiranje | 1658 (1455) | BlueRunner |
» | [C++] Preverjanje ce je program dos ali win32Oddelek: Programiranje | 1407 (1063) | BigWhale |
» | [C++] preprosto risanjeOddelek: Programiranje | 1660 (1537) | popec |
» | [C] parse errorOddelek: Programiranje | 1022 (957) | ql000 |
» | [C/C++] unsigned long lala = -1;Oddelek: Programiranje | 1165 (1124) | Vesoljc |