Имеется больше тысячи cpp файлов, необходимо в текстовом файле вывести список всех глобальных переменных. Есть ли специальный софт для решения подобной задачи? Или необходимо писать свой скрипт?
Ответ
Вот, поподробнее об использовании nm (см. man nm) для получения списка глобальных переменных, определенных в заданных .cpp файлах. Я подразумеваю, что интересны только переменные (и константы), но не функции.
Для примера сделаем пару С++ файлов.
// ext1.cpp
#include
using namespace std;
int esum,
e1 = 1;
extern int e2;
int const econ1 = 2; // в c++ это НЕ ГЛОБАЛЬНАЯ КОНСТАНТА !!!
extern int const econ; // а это ГЛОБАЛЬНАЯ(!!!), но не определенная здесь
void sumext();
int
main ()
{
sumext(); // помещает сумму всех глобальных (кроме esum) в esum
cout << "DoubleSum: " << esum + econ + e1 + e2 << '
';
}
// ext2.cpp
extern int esum, e1;
int e2 = 2;
extern int const econ = 3; // ГЛОБАЛЬНАЯ КОНСТАНТА, определена здесь
void sumext()
{
esum = e1 + e2 + econ;
}
Оттранслируем их, получив объектные файлы ext1.o и ext2.o
avp@avp-ubu1:~/hashcode$ g++ -c ext1.cpp ext2.cpp
и посмотрим на вывод утилиты nm
avp@avp-ubu1:~/hashcode$ nm ext[12].o
ext1.o:
000000000000009f t _GLOBAL__sub_I_esum
000000000000005f t _Z41__static_initialization_and_destruction_0ii
U _Z6sumextv
000000000000000c r _ZL5econ1
U _ZNSolsEi
U _ZNSt8ios_base4InitC1Ev
U _ZNSt8ios_base4InitD1Ev
U _ZSt4cout
0000000000000004 b _ZStL8__ioinit
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc
U _ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_c
U __cxa_atexit
U __dso_handle
0000000000000000 D e1
U e2
U econ
0000000000000000 B esum
0000000000000000 T main
ext2.o:
0000000000000000 T _Z6sumextv
U e1
0000000000000000 D e2
0000000000000000 R econ
U esum
Легко заметить, что инициализированные переменные e1 и e2 отмечены флагом D, неинециализированная переменная esum отмечена флагом B, а глобальная константа флагом R.
В файлах, где эти переменные и константа являются внешними, они отмечены флагом U.
Для первого приближения к решению можно написать скрипт на awk
avp@avp-ubu1:~/hashcode$ for i in ext[12].o; do echo Global variables defined in $i; nm $i | awk 'NF == 3 && ($2 == "D" || $2 == "B" || $2 == "R") { print $2 " " $3 }'; done
Global variables defined in ext1.o
D e1
B esum
Global variables defined in ext2.o
D e2
R econ
Ну и наконец, сделать исполнимый модуль и посмотреть, работает ли программа
avp@avp-ubu1:~/hashcode$ g++ -o ext12 ext1.o ext2.o
avp@avp-ubu1:~/hashcode$ ./ext12
DoubleSum: 12
avp@avp-ubu1:~/hashcode$
Комментариев нет:
Отправить комментарий