MSVC функция разграничения
У меня есть следующие функции:
namespace TEST {
class TEST {
int a;
int b;
};
}
namespace UNION_TEST {
union UNION_TEST {
int a;
int b;
};
}
union UNION_TEST_NEW {
int a;
int b;
};
namespace NAMESPACE_1 {
namespace NAMESPACE_2 {
union UNION_NAMESPACE_2 {
int a, b;
};
}
}
void f1(UNION_TEST::UNION_TEST t, UNION_TEST::UNION_TEST t1) {
return;
}
void f2(UNION_TEST::UNION_TEST t, TEST::TEST c, UNION_TEST::UNION_TEST t1) {
return;
}
void f3(UNION_TEST_NEW u) {
return;
}
void f4(NAMESPACE_1::NAMESPACE_2::UNION_NAMESPACE_2 u, TEST::TEST c, UNION_TEST::UNION_TEST t1) {
return;
}
И соответствуют искаженные символы являются:
0x000034e0 2 .text ?f1@@YAXTUNION_TEST@1@0@Z
0x00003500 2 .text ?f2@@YAXTUNION_TEST@1@VTEST@2@0@Z
0x00003520 2 .text ?f3@@YAXTUNION_TEST_NEW@@@Z
0x00003530 2 .text ?f4@@YAXTUNION_NAMESPACE_2@NAMESPACE_2@NAMESPACE_1@@VTEST@4@TUNION_TEST@5@@Z
Согласно этому http://www.agner.org/optimize/calling_conventions.pdf (стр. 27), у нас есть это объединение X -> TX@@, так почему для функции f1, f2 нет @@ в конце и Как отличить, когда объединение с пространством имен заканчивается и начинается следующий аргумент?
Спасибо за внимание и помощь.
1 ответ
Решение
Как вы заметили, заявление о том, что профсоюзное имя X
превращается в TX@@
неверное описание искажения имени, используемого вашей версией MSVC. Обратите внимание, что "agner.org" не связан с Microsoft и не предоставляет официальную документацию.
Что касается вашего вопроса о том, как разные части искаженного имени разделены, кажется, что одного @ достаточно.