Определение источника включенного символа в C ++ - PullRequest
5 голосов
/ 17 декабря 2011

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

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

Ответы [ 2 ]

2 голосов
/ 17 декабря 2011

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

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

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

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

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

РЕДАКТИРОВАТЬ: В результате вывода C ++ Filter - вы уверены, что он скомпилирован в VC ++?

0 голосов
/ 17 декабря 2011

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

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

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

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

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

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

Заменить

"{# include. *}"

с

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

в целомпроект.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...