Dekorowanie nazw: Różnice pomiędzy wersjami
[wersja przejrzana] | [wersja przejrzana] |
m Dodaję nagłówek przed Szablon:Przypisy |
m Zamieniam przestarzały tag 'source' na 'syntaxhighlight' |
||
Linia 12: | Linia 12: | ||
Po kompilacji poniższego przykładu w C: |
Po kompilacji poniższego przykładu w C: |
||
< |
<syntaxhighlight lang="c"> |
||
int _cdecl f (int x) {return 0;} |
int _cdecl f (int x) {return 0;} |
||
int _stdcall g (int y) {return 0;} |
int _stdcall g (int y) {return 0;} |
||
int _fastcall h (int z) {return 0;} |
int _fastcall h (int z) {return 0;} |
||
</syntaxhighlight> |
|||
</source> |
|||
32-bitowy kompilator wygeneruje: |
32-bitowy kompilator wygeneruje: |
Wersja z 23:55, 17 kwi 2020
Dekorowanie nazw (ang. name mangling, name decoration) – technika stosowana przez kompilatory współczesnych języków programowania w celu wygenerowania unikatowych nazw funkcji, struktur, klas oraz innych typów danych[1][2]. Schemat generowania unikalnych nazw różni się w zależności od tego jaki kompilator został zastosowany[2].
Geneza
Potrzeba stosowania dekorowania nazw przez kompilatory wynika z konfliktu pomiędzy wymaganą unikalnością nazw a stosowaną we współczesnych językach programowania techniką przeciążania nazw.
Dekorowanie nazw w C dla Microsoft Windows
Jakkolwiek technika dekorowania nazw ogólnie nie jest wymagana przez języki programowania, które nie wspierają przeciążania funkcji (np. C i Pascal), jednak w pewnych przypadkach jest stosowana aby poszerzyć zakres informacji opisujących funkcje.
Na przykład kompilator dedykowany platformie Microsoft Windows wspiera obsługę konwencji wywołania, które określają sposób przekazywania parametrów do funkcji i odsyłania wyniku przez funkcję. Ponieważ różne konwencje wywołania nie są ze sobą kompatybilne, kompilator dekoruje nazwy symbolami określającymi, która z nich ma zostać użyta.
Schemat dekorowania nazw zaproponowany przez Microsoft, wspierany przez kompilatory Digital Mars, Borland i GNU gcc, używany jest przy kompilowaniu kodu na platformę Windows. Schemat ten jest również stosowany przez inne języki, takie jak Pascal, D, Delphi, Fortran i C#.
Po kompilacji poniższego przykładu w C:
int _cdecl f (int x) {return 0;}
int _stdcall g (int y) {return 0;}
int _fastcall h (int z) {return 0;}
32-bitowy kompilator wygeneruje:
_f _g@4 @h@4
Dekorowanie nazw funkcji stdcall i fastcall stosuje schemat _nazwa@X i @nazwa@X, gdzie nazwa jest nazwą funkcji, a X określa liczbę bajtów argumentów funkcji. W przypadku funkcji cdecl, dekorowanie polega wyłącznie na dodaniu prefiksu „_”.
Przypisy
- ↑ Danny Kalev: Czym jest dekorowanie nazw. [dostęp 2009-05-25]. (ang.).
- ↑ a b Dekorowanie nazw. [dostęp 2009-05-25].