Сейчас я работаю над проблемой, ее постановкой - сгенерировать текстовый файл со списком всех объявленных глобальных переменных в файле .CPP.
У меня появилось несколько идей, первая:
Попробуйте использовать ctags, поэтому я написал небольшой скрипт:
while read line
do
echo $line
printf "%s" $line >> report.txt
ctags -x --c++-kinds=v --file-scope=no "{$line}" | sort | sed "/const/d" | awk '{printf " %s", $1}' >> report.txt
printf "\n" >> report.txt
done < cpp_source_file_list.txt
Этот фрагмент кода получает имя исходного файла .cpp из cpp_source_file_list.txt, сканирует его на наличие глобальных переменных (игнорируя const) и записывает отчет «имя файла [список переменных]. Основная проблема, с которой я столкнулся, заключается в том, что ctags ведет себя очень странно, игнорируя в некоторых случаях типы STL.
Например, он может исключать строку типа "vector v;", но включать "std::vector v;".
Есть ли способы исправить такую проблему? Попытка использовать дополнительный ключ ctags -I ./id.txt и вручную составить список идентификаторов для переопределения, но это также приводит к неверным результатам.
Второй способ:
Используйте команду nm, например:
nm builtsource.o | grep '[0-9A-Fa-f]* [BCDGRS]'
Но в этом случае я получаю ненужную информацию, например:
0000000000603528 B M
0000000000603548 B N
0000000000603578 B _ZSt3cin@@GLIBCXX_3.4 <- (!)
0000000000603579 B _ZSt4cout@@GLIBCXX_3.4 <- (!)
0000000000603748 B t
И теперь я понятия не имею, как улучшить один из этих методов, чтобы получить правильную информацию о списке объявленных глобальных переменных из произвольного исходного файла .cpp. Буду рад услышать любые предложения по этой проблеме.