"stałe" kompilatora

0

Witam Wszystkich!

Interpreter języka PHP dostarcza kilku predefiniowanych zmiennych pomocnych przy debugowaniu, Podobnie jest z kompilatorami, które dostarczają pewnych makr.

A teraz w odniesieniu do DELPHI. Staram się napisać pewien moduł, który byłby odpowiedzialny za logowanie zdarzeń w aplikacji. Bardzo przydał by mi się przykład pewnego rozwiązania, które znam z innych języków (wspomniane powyżej), a których nie doszukałem się w DELPHI. Mianowicie coś w rodzaju dyrektywy kompilatora, czy też makra jak __line__ w PHP i C++ w każde miejsce wystąpienia takiego ciągu (o ile nie jest literałem) kompilator / interpreter wstawia numer linii w pliku w którym ciąg wystąpił. Podobnie ciągi: __function__ oraz __file__ zamieniane są na nazwę funkcji w jakiej ciąg występuje oraz nazwę pliku. Jak wyglądają takie konstrukcje w DELPHI?

0

od tego są np. madexception, eurekalog, czy exceptiondialog z pakietu jedi

0

Niestety nie mam JEDI. Poza tym, to chyba byłaby armata na muchy. Ja po prostu chciałbym wyświetlić numer lini np. w ten sposób:

Z PHP:

echo "Punkt wykonania w linii: ".__line__." w pliku: ".__file__."!";

Interpreter rozwinie to do następującego ciągu:

echo "Punkt wykonania w linii: "."37"." w pliku: "."przyklad.php"."!";

Kompilator DELPHI nie ma czegoś takiego? (aż nie chce mi się wierzyć :) )

0

delphi kompiluje się do pliku exe - tam już nie masz numerów linii i nazw procedur - to nie php!

0

C++ też kompiluje się do kodu binarnego w którym też nie ma numerów linii, nazw funkcji i plików źródłowych. W C++ załatwia to pre-procesor. A działa dokładnie tak samo jak pokazałem w przykładzie dla PHP. W momęcie kompilacji (w C++ tuż przed) pre-procesor zamienia po prostu wszystkie wystąpienia frazy __line__ na numer wiersza w pliku źródłowym w efekcie czego kompilator otrzymuje np:

std::cout << "linia: " + "30";

W miejsce wpisanego przez kodera:

std:cout << "linia: " + __line__;

Właśnie o to chodzi, że nie ma to być element języka, tylko IDE. Nie interesuje mnie funkcja czasu wykonania, tylko "stała", stąd zresztą w temacie wątku "stałe".

W swoim oryginalnym kodzie w DELPHI mam:


...
try
  Ryzykowany kod
except
  on e : exception do
  begin
    self.status := e.message;
    frmLog.AddLog ('UTest', 'Przyklad', '47', e.message);
  end;
end;
...

Gdzie forma o nazwie frmLog ma metodę: AddLog, której prototyp to:

Procedure TfrmLog.AddLog (sSourceFileName, sFunctionName, sLineNumber, Message : String);

Jeśli teraz zacznę dopisywać kod w jakimś miejscu, to muszę wszędzie za tym fragmentem co dopisałem ręcznie zmienić numer linii.

Gdybym zaś wedle modły PHP / C++ wpisał:

...
try
...
except
...
frmLog.AddLog (__file__, __function__, __line__, e.message);
...
end;

Nie musiałbym dalej w kodzie modyfikować XXX wystąpień wołania metody AddLog przy jakichkolwiek zmianach :)

Mam nadzieję, ze teraz już wszystko jasno wyłożyłem :)

0

napisałem Ci wcześniej od tego jest EurekaLog, MadException i podobne. Całe ich użycie (w przypadku MadException) to kliknięcie w project->madExcept Settings i ustawieniu co i jak ma być logowane

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