Определение источника включенного символа в C++

В настоящее время я работаю над проектом, который запрещает включение стандартной библиотеки С++. Один из скомпилированных файлов, которые мы используем, содержит следующий символ: _Xran__Q2_3std12_String_baseCFv

Я считаю, что это относится к стандартным строкам библиотеки. Я неправильно так думаю? Если нет, то знает ли кто-нибудь об эффективном способе отслеживания точки, в которой был включен этот символ? Беглый просмотр кодовой базы не показывает ничего очевидного.


person Greg    schedule 16.12.2011    source источник
comment
Это похоже на искаженное название чего-то, связанного с std::_String_base. Прежде чем вы начнете цитировать меня, знайте, что я понятия не имею, как VS коверкает имена.   -  person cHao    schedule 17.12.2011
comment
Вы знаете, в каком объектном файле он находится, и вам нужно найти, какой #include отвечает, или вы пытаетесь найти объектный файл?   -  person Karl Bielefeldt    schedule 17.12.2011
comment
см. этот вопрос: stackoverflow.com/questions/ 5310590/   -  person Preet Sangha    schedule 17.12.2011
comment
Может быть, вы можете запустить препроцессор над файлами, а затем найти полученный результат (cl.exe /P)   -  person Felix Dombek    schedule 17.12.2011
comment
@Карл Оба, к сожалению. Проблема связана с файлом, который я получаю в виде скомпилированной библиотеки от члена команды на удаленном сайте. У меня есть хакерский способ сузить поле в среде Unix, но я менее знаком с неуклюжими трюками Windows.   -  person Greg    schedule 17.12.2011
comment
_Xran() — это вспомогательный метод во многих шаблонах классов VC, который создает ошибку std::out_of_range. Искаженное имя, кажется, предполагает, что оно происходит от std::basic_string или его базового класса.   -  person Xeo    schedule 17.12.2011
comment
Немного покопавшись, он действительно находится в std::basic_string. Я не понимаю, как это искажается до _String_base. Какую версию VS используете?   -  person Xeo    schedule 17.12.2011
comment
@Xeo На данный момент мы используем VS2010. Я предполагал, что это связано со строками STL. Однако оцените объяснение.   -  person Greg    schedule 18.12.2011


Ответы (2)


Это не похоже на искажение VC, которое всегда начинается со знака вопроса.

Однако он соответствует схеме искажения G++, как это предлагается при запуске

$ c++filt  --format=gnu "_Xran__Q2_3std12_String_baseCFv"
std::_String_base::_Xran( const(void))

Странно то, что _Xran кажется частью реализации VC для std::string.

В любом случае, заголовок, который вы ищете, вероятно, #include <string>.

EDIT: В результате вывода c++filt вы уверены, что он скомпилирован в VC++?

person user1071136    schedule 16.12.2011
comment
Учитывая, что большинство реализаций стандартной библиотеки C++ в значительной степени заимствуют из оригинальной SGI-версии STL, не так уж удивительно найти одно и то же имя _Xran как в VC, так и в C++. - person Ben Voigt; 17.12.2011
comment
Боюсь, я не узнаю аббревиатуру VC. Вы можете уточнить? - person Greg; 18.12.2011
comment
ВК = Visual C/C++; компилятор C++ в пакете Visual Studio. - person user1071136; 18.12.2011
comment
О да. Я вполне согласен, что мы ищем библиотеку строк. Учитывая это, я проверяю включение во время компиляции на наличие подсказок. - person Greg; 19.12.2011
comment
Подтвержденный. Автор действительно компилирует на VC++ версии 2010. - person Greg; 21.12.2011

Если где-то действительно присутствует string.h, вы можете узнать, где:

Поместите в следующей строке после каждой директивы #include следующий код:

using namespace std;class string;struct{void hxtestfunc(void){typedef string hxtesttype;}};

При компиляции это будет генерировать ошибку «неоднозначный символ», только если string.h (или любой файл, который прямо или косвенно включает string.h) был где-то ранее включен.

Таким образом, первая зарегистрированная ошибка «неоднозначный символ» приведет вас к строке сразу после критического включения.

В Visual C++ вы можете использовать поиск и замену с регулярным выражением:

Заменять

"{#включать.*}"

с

"\0\nиспользование пространства имен std;строка класса;struct{void htestfunc(void){typedef string htesttype;}};"

во всем проекте.

person Baltram    schedule 17.12.2011
comment
<string.h> является заголовком C. Вы, вероятно, говорите о <string>. - person cHao; 20.12.2011
comment
Это хорошо независимо от платформы, но пугающе трудоемко для исправления каждого #include. Чертовски умный, акцент на дьявольском. - person Greg; 21.12.2011