Могу ли я программно отменить привязку символа в C / GCC / Ubuntu?

#c #gcc #cppunit

#c #gcc #cppunit

Вопрос:

Когда я компилирую это выражение (CppUnit) в GCC / Ubuntu

 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION(wcsdesign::tests::ConduitTestFixture, "wcsdesign_Conduit");
  

Значение wcsdesign::tests::ConduitTestFixture в конечном итоге преобразуется в N9wcsdesign5tests18ConduitTestFixtureE .

Есть ли какой-либо способ, которым я могу программно получить исходную строку «wcsdesign::tests::ConduitTestFixture» с учетом «N9wcsdesign5tests18ConduitTestFixtureE»?

Ответ №1:

Добавьте _Z к символу, прежде чем передавать его abi::__cxa_demangle . Затем вы получаете исходную строку обратно.

Комментарии:

1. обратите внимание, что искажение имени не выполняется препроцессором (при первом прочтении вашего вопроса предполагалось, что речь идет о поведении макроса препроцессора)

2. @MattMcNabb, не так ли? Кажется, что он искажается в макросе при объединении символов с ## оператором. Разве препроцессор не отвечает за это?

3. препроцессор выполняет ## , но он не искажает имена. Можете ли вы опубликовать тестовый пример? (Кстати, вы можете использовать gcc -E для просмотра программы после предварительной обработки)