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!

Author: Igor Kustov, 2010-05-30

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++.

 23
Author: Nikolai Fetissov,
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ę.

 15
Author: egrunin,
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".

 8
Author: Kate Gregory,
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.

 5
Author: Donnie,
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
 2
Author: Santosh,
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