Имя шаблона G ++ Cangling
-
28-09-2019 - |
Вопрос
Мне нужно использовать адрес элемента класса шаблона в встроенной сборке G ++ (как постоянное значение времени компиляции). Можно ли это выразить? (Я думаю, что мне нужно озвученное имя T<U>::x
).
template < typename U >
struct T {
static int x;
};
template < typename U >
void f () {
asm ("somecommand T<U>::x");
}
Решение
Предполагая, что вы используете Linux, вы можете использовать NM.
NM --Demangle Foo.o дает вам деграфовые имена для ваших символов NM --no-demangle Foo.o дает вам потрясенные имена для ваших символов.
Затем вы можете сравнить выходные данные этих 2 файлов, чтобы сопоставить имя MANGLED к Dunnangled Name.
Другие советы
Я бы использовал objdump
Чтобы извлечь потрясенное имя из объекта, который ссылается на него (вы можете использовать c++filt
идти в другое направление, но я знаю, что не стандартная программа, предоставляющая уплотненное имя; Вы можете использовать спецификацию http://www.codesourcery.com/public/cxx-abi/abi.html. и создает мангуров или делать поклонников вручную, но это, вероятно, излишки).