pytania o wymachiwanie nazw w C++
Staram się nauczyć i zrozumieć wymachiwanie nazw w C++. Oto kilka pytań:
(1) From devx
Gdy funkcja globalna jest przeciążona, wygenerowana nazwa zniekształcona dla każdej przeciążonej wersji jest unikalna. Mangling nazw jest również stosowany do zmiennych. Tak więc zmienna lokalna i zmienna globalna o tej samej nazwie użytkownika nadal otrzymują różne zniekształcone nazwy.
Czy są inne przykłady, które używają nazwy mangling, oprócz przeciążenia funkcje i zmienne globalne i lokalne o tej samej nazwie ?
(2) Z Wiki
Pojawia się potrzeba, gdy język pozwala na nazwanie różnych jednostek z tym samym identyfikatorem, o ile zajmują one inną przestrzeń nazw (gdzie przestrzeń nazw jest zazwyczaj definiowana przez dyrektywę modułu, klasy lub jawnej przestrzeni nazw).
Nie do końca rozumiem, dlaczego namaglowanie nazw jest stosowane tylko w przypadkach, gdy identyfikatory należą do różnych przestrzeni nazw, ponieważ funkcje przeciążające mogą znajdować się w tej samej przestrzeni nazw, A zmienne globalne i lokalne o tej samej nazwie również mogą znajdować się w tej samej przestrzeni. Jak to zrozumieć?
Czy zmienne o tej samej nazwie, ale w różnych zakresach również używają name mangling?
(3) Czy C ma nazwę mangling? Jeśli tak nie jest, to jak może poradzić sobie z przypadkiem, gdy niektóre zmienne globalne i lokalne mają tę samą nazwę? C nie ma funkcji przeciążania, prawda?
Dzięki i pozdrawiam!
5 answers
C nie wykonuje namaszczania nazw, chociaż pre-dodaje podkreślenie do nazw funkcji, więc printf(3)
jest rzeczywiście _printf
w obiekcie libc.
W C++ historia jest inna. Historia jest taka, że pierwotnie Stroustrup stworzył" C with classes " lub cfront, kompilator, który przetłumaczyłby wczesne C++ Na C. Następnie reszta narzędzi-C compiler i linker użylibyśmy do stworzenia kodu obiektowego. Oznaczało to, że nazwy C++ musiały być jakoś przetłumaczone na nazwy C. To jest dokładnie co robi namaszczenie nazwy . Zapewnia unikalną nazwę dla każdego członka klasy oraz funkcji i zmiennej globalnej/przestrzeni nazw, więc przestrzeń nazw i nazwy klas (dla rozwiązania) i typy argumentów (dla przeciążenia) są w jakiś sposób zawarte w końcowych nazwach linkera.
Jest to bardzo łatwe do zobaczenia za pomocą narzędzi takich jak nm(1)
- skompiluj swoje źródło C++ i spójrz na wygenerowane symbole. Na OSX z GCC:
namespace zoom
{
void boom( const std::string& s )
{
throw std::runtime_error( s );
}
}
~$ nm a.out | grep boom
0000000100001873 T __ZN4zoom4boomERKSs
Zarówno w C jak i C++ lokalne (automatyczne) zmienne Nie symbole, ale żyją w rejestrach lub na stosie.
Edit:
Zmienne lokalne nie mają nazw w wynikowym pliku obiektowym tylko dlatego, że linker nie musi o nich wiedzieć. Więc bez nazwiska, bez marszczenia. Wszystko inne (na co linker musi patrzeć) jest nazwane w C++.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-06-11 13:22:12
Mangling jest po prostu tym, jak kompilator utrzymuje linkera szczęśliwym.
W C, nie możesz mieć dwóch funkcji o tej samej nazwie, bez względu na wszystko. Tak więc linker został napisany, aby przyjąć: unikalne nazwy. (Możesz mieć funkcje statyczne w różnych jednostkach kompilacji, ponieważ ich nazwy nie są interesujące dla linkera.)
W C++ możesz mieć dwie funkcje o tej samej nazwie, o ile mają różne typy parametrów. Więc C++ łączy nazwę funkcji z typami w jakiś sposób. W ten sposób linker postrzega je jako posiadające różne nazwy.
Zauważ, że nie ma znaczenia, jak nazwa zostanie zniekształcona, a w rzeczywistości każdy kompilator robi to inaczej. Liczy się tylko to, że każda funkcja o tej samej nazwie bazowej jest w jakiś sposób unikalna dla linkera.
Teraz widać, że dodawanie przestrzeni nazw i szablonów do mieszanki wciąż rozszerza zasadę.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 05:29:51
Technicznie rzecz biorąc, to "dekorowanie". To brzmi mniej prymitywnie, ale także zniekształcanie sugeruje, że CreditInterest
może zostać przestawione na IntCrederestit
, podczas gdy to, co się dzieje, jest bardziej podobne do _CreditInterest@4
, co jest, uczciwie mówiąc," ozdobionym " bardziej niż zniekształconym. To powiedziawszy, ja też nazywam to mangling: -) ale znajdziesz więcej informacji technicznych i przykładów, jeśli szukasz "C++ name decoration".
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 02:26:50
Czy są inne przykłady, które używają wymazywania nazw, oprócz przeciążania funkcji i zmiennych globalnych i lokalnych o tej samej nazwie?
C++ mangles wszystkie symbole, zawsze. To jest po prostu łatwiejsze dla kompilatora. Zazwyczaj mangling koduje coś o liście parametrów lub typach, ponieważ są to najczęstsze przyczyny manglingu.
C nie mangle. Scoping służy do kontrolowania dostępu do zmiennych lokalnych i globalnych o tej samej nazwie.
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2010-05-30 02:17:08
Source:http://sickprogrammersarea.blogspot.in/2014/03/technical-interview-questions-on-c_6.html
Name mangling jest procesem używanym przez kompilatory C++ nadającym każdej funkcji w programie unikalną nazwę. W C++ ogólnie programy posiadają co najmniej kilka funkcji o tej samej nazwie. Tak więc mangling nazw może być uważany za ważny aspekt W C++.
Przykład: Zwykle nazwy członków są unikalnie generowane przez połączenie nazwy członka z klasą np. podaną deklaracją:
class Class1
{
public:
int val;
...
};
Val staje się czymś w rodzaju:
// a possible member name mangling
val__11Class1
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-03-21 07:58:04