Страницы

Поиск по вопросам

среда, 3 апреля 2019 г.

Список глобальных переменных

Имеется больше тысячи 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$

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

Отправить комментарий