Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.86/14: Рейтинг темы: голосов - 14, средняя оценка - 4.86
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11

нужно найти Глобальные Переменные в .срр файле

23.07.2013, 21:09. Показов 3426. Ответов 37
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
у меня вот такая задача
Дано много .срр файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его глобальные переменные. Приветствуются отсылки к каким-нибудь утилитам, которые это умеют делать
парсер писать не реально
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
23.07.2013, 21:09
Ответы с готовыми решениями:

Как сделать несколько функций в одном срр ?Написал программы, которые нужно поочередно запустить в одном срр
#include <iostream> void func(double& x,double& y) { double temp_min = (x + y) / 2.0;; if(x == std::min(x,y)) { ...

Глобальные и статические глобальные переменные
Скажите, чем отличаются глобальные переменные от статических глобальных переменных?

Глобальные переменные
Я правильно понимаю: "в c++ использовать глобальные переменные не безопасно, т. к. др. программы могут случайно поменять значение этих...

37
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.07.2013, 13:21
Студворк — интернет-сервис помощи студентам
castaway, Используя clang c++ api я так и не смог собрать представленный там код. При линковке всех нужных библиотек давало undefined ref к createDiagnostics, возможно у меня просто неправильно собран clang.

Добавлено через 1 час 38 минут
Меня хватило на вот это:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
 
#include <vector>
#include <iostream>
#include <memory>
#include <typeinfo>
#include <clang/Basic/Diagnostic.h>
#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/CompilerInvocation.h>
#include <clang/Frontend/Utils.h>
#include <clang/Frontend/ASTUnit.h>
int main()
{
   using namespace clang;
   using namespace llvm;
 
   std::unique_ptr<CompilerInstance> compiler(new CompilerInstance());
   compiler->createDiagnostics(0, nullptr);
   const char* args[] =
   {
      "-cc1",
      "test_file.cpp"
   };
   CompilerInvocation::CreateFromArgs
   (
      compiler->getInvocation(),
      args,
      args + 2,
      compiler->getDiagnostics()
   );
   std::unique_ptr<ASTUnit> unit
   (
      ASTUnit::LoadFromCompilerInvocation
      (
         &compiler->getInvocation(),
         IntrusiveRefCntPtr<DiagnosticsEngine>(&compiler->getDiagnostics()),
         false,
         true,
         false,
         TU_Complete,
         false
      )
   );
   if (unit)
   {
      std::cout << "Parsed succesfully" << std::endl;
   }
   else
   {
      std::cerr << "Parsing error" << std::endl;
      return 1;
   }
   ASTUnit::top_level_iterator decls_begin = unit->top_level_begin(), decls_end = unit->top_level_end();
   for (; decls_begin != decls_end; ++decls_begin)
   {
      Decl* decl = *decls_begin;
      VarDecl* var = dyn_cast<VarDecl>(decl);
      if (var)
      {
         if (var->isFileVarDecl())
         {
            std::cout << "global " << var->getNameAsString() << std::endl;
         }
      }
   }
}
Bash
1
cat test_file.cpp
C++
1
2
3
int value = 0;
struct {
} object;
Bash
1
2
3
4
./clang_parse 
Parsed succesfully
global value
global object
2
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.07.2013, 13:30
А меня на такой.
Кликните здесь для просмотра всего текста
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
#include <iostream>
 
#include "llvm/Support/raw_ostream.h"
#include "llvm/Support/Host.h"
 
#include "clang/Basic/DiagnosticOptions.h"
#include "clang/Frontend/TextDiagnosticPrinter.h"
 
#include "clang/Basic/LangOptions.h"
#include "clang/Basic/FileSystemOptions.h"
 
#include "clang/Basic/SourceManager.h"
#include "clang/Lex/HeaderSearch.h"
#include "clang/Basic/FileManager.h"
 
#include "clang/Basic/TargetOptions.h"
#include "clang/Basic/TargetInfo.h"
 
#include "clang/Lex/Preprocessor.h"
#include "clang/Frontend/CompilerInstance.h"
 
int main()
{
    clang::DiagnosticOptions diagnosticOptions;
    clang::TextDiagnosticPrinter *pTextDiagnosticPrinter = new clang::TextDiagnosticPrinter( llvm::outs(), &diagnosticOptions );
 
    llvm::IntrusiveRefCntPtr <clang::DiagnosticIDs> pDiagIDs;
    clang::DiagnosticsEngine *pDiagnosticsEngine = new clang::DiagnosticsEngine( pDiagIDs, &diagnosticOptions, pTextDiagnosticPrinter );
 
    clang::FileSystemOptions fileSystemOptions;
    clang::FileManager fileManager( fileSystemOptions );
    clang::SourceManager sourceManager( *pDiagnosticsEngine, fileManager );
 
    clang::TargetOptions targetOptions;
    targetOptions.Triple = llvm::sys::getDefaultTargetTriple();
 
    clang::TargetInfo *pTargetInfo = clang::TargetInfo::CreateTargetInfo( *pDiagnosticsEngine, &targetOptions );
 
    llvm::IntrusiveRefCntPtr <clang::HeaderSearchOptions> hso;
 
    clang::LangOptions languageOptions;
    clang::HeaderSearch headerSearch( hso, fileManager, *pDiagnosticsEngine, languageOptions, pTargetInfo );
 
    llvm::IntrusiveRefCntPtr <clang::PreprocessorOptions> pOpts;
    clang::CompilerInstance compInst;
    clang::Preprocessor preprocessor( pOpts, *pDiagnosticsEngine, languageOptions, pTargetInfo, sourceManager, headerSearch, compInst );
 
    //const clang::FileEntry *pFile = fileManager.getFile( "test.c" );
    sourceManager.createMainFileID( fileManager.getFile( "test.c" ) /*pFile*/ );
    preprocessor.EnterMainSourceFile();
    pTextDiagnosticPrinter->BeginSourceFile( languageOptions, &preprocessor );
 
    clang::Token token;
    do {
        preprocessor.Lex( token );
        if ( pDiagnosticsEngine->hasErrorOccurred() ) break;
        preprocessor.DumpToken( token );
        std::cerr << std::endl;
    } while ( token.isNot( clang::tok::eof ) );
 
    pTextDiagnosticPrinter->EndSourceFile();
    return 0;
}
Кликните здесь для просмотра всего текста
test.c
C++
1
2
3
4
5
6
7
int g_a = 100;
 
int main()
{
    int l_a = 200;
    return 0;
}
Кликните здесь для просмотра всего текста
Вывод:
int 'int'
identifier 'g_a'
equal '='
numeric_constant '100'
semi ';'
int 'int'
identifier 'main'
l_paren '('
r_paren ')'
l_brace '{'
int 'int'
identifier 'l_a'
equal '='
numeric_constant '200'
semi ';'
return 'return'
numeric_constant '0'
semi ';'
r_brace '}'
eof ''
Только он просто парсит...
ForEveR, у тебя не 3.3 версия я так понимаю? У меня в 3.3 нет clang/Frontend/DiagnosticOptions.h
1
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.07.2013, 14:07
castaway, 3.2 да. Твой код явно интереснее и чище.

Добавлено через 31 минуту
Вот код из туториалов по clang-api
https://github.com/loarabia/Cl... orial6.cpp
Ищет глобальные не extern переменные.
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.07.2013, 14:25
Кстати, код, который я привел, тоже оттуда. Я лишь внес незначительные изменения.
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 15:41  [ТС]
ниужели не у кого нет рабочего кода?
0
24.07.2013, 15:59

Не по теме:

У кого-то точно есть. Главное верить, и повторять: исчезни боль, проблемы прочь, проблемы прочь.. И самое главное - это аутотренинг!

0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:01  [ТС]
Цитата Сообщение от ForEveR Посмотреть сообщение
castaway, Используя clang c++ api я так и не смог собрать представленный там код. При линковке всех нужных библиотек давало undefined ref к createDiagnostics, возможно у меня просто неправильно собран clang.

Добавлено через 1 час 38 минут
Меня хватило на вот это:

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
#define __STDC_LIMIT_MACROS
#define __STDC_CONSTANT_MACROS
 
#include <vector>
#include <iostream>
#include <memory>
#include <typeinfo>
#include <clang/Basic/Diagnostic.h>
#include <clang/Frontend/DiagnosticOptions.h>
#include <clang/Frontend/CompilerInstance.h>
#include <clang/Frontend/CompilerInvocation.h>
#include <clang/Frontend/Utils.h>
#include <clang/Frontend/ASTUnit.h>
int main()
{
   using namespace clang;
   using namespace llvm;
 
   std::unique_ptr<CompilerInstance> compiler(new CompilerInstance());
   compiler->createDiagnostics(0, nullptr);
   const char* args[] =
   {
      "-cc1",
      "test_file.cpp"
   };
   CompilerInvocation::CreateFromArgs
   (
      compiler->getInvocation(),
      args,
      args + 2,
      compiler->getDiagnostics()
   );
   std::unique_ptr<ASTUnit> unit
   (
      ASTUnit::LoadFromCompilerInvocation
      (
         &compiler->getInvocation(),
         IntrusiveRefCntPtr<DiagnosticsEngine>(&compiler->getDiagnostics()),
         false,
         true,
         false,
         TU_Complete,
         false
      )
   );
   if (unit)
   {
      std::cout << "Parsed succesfully" << std::endl;
   }
   else
   {
      std::cerr << "Parsing error" << std::endl;
      return 1;
   }
   ASTUnit::top_level_iterator decls_begin = unit->top_level_begin(), decls_end = unit->top_level_end();
   for (; decls_begin != decls_end; ++decls_begin)
   {
      Decl* decl = *decls_begin;
      VarDecl* var = dyn_cast<VarDecl>(decl);
      if (var)
      {
         if (var->isFileVarDecl())
         {
            std::cout << "global " << var->getNameAsString() << std::endl;
         }
      }
   }
}
у меня пишет
Cannot open include file: 'clang/Basic/Diagnostic.h': No souch file or directory
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.07.2013, 17:03
Hamlet, этот код для Clang версии 3.3
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:07  [ТС]
а clang это компилятор, что ли?
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.07.2013, 17:08
Hamlet, Да. С добрым утром. Если вы серьезно думаете, что кто-то будет вам писать такую программу просто так + к тому даже не пытаетесь погуглить/попробовать узнать, что за варианты тут представлены, то вы сильно ошибаетесь.
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:14  [ТС]
я уже 3-ий день сижу в гугле и никакого сересного ответа пока не нашел
попробовал
1. gccxml->xQuery ничего не получился
2. cpp->object->grep
3. clang
4. Source Insight
5. ctags
6. nm->UNIX, dumpbin с опцией /symbols для windows

никакого толка нету, я никогда раньше не сталкивался с такими проблемами и по этому не разбераюсь в этих варянтах
0
В астрале
Эксперт С++
 Аватар для ForEveR
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
24.07.2013, 17:18
Hamlet, С clang это сделать возможно. Но это нужно читать документацию и серьезно изучать clang api.
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:20  [ТС]
а вот на это у меня не хватает время так как для решения задач у меня остался всего лишь 2 дня
0
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.07.2013, 17:22
Hamlet, тогда настоятельно рекомендую обратиться в этот: https://www.cyberforum.ru/order-program/ раздел.
0
433 / 368 / 149
Регистрация: 06.08.2012
Сообщений: 961
24.07.2013, 17:42
Поиск глобальных переменных
0
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:46  [ТС]
там тоже ничего серезного нет
0
Higher
 Аватар для diagon
1953 / 1219 / 120
Регистрация: 02.05.2010
Сообщений: 2,925
Записей в блоге: 2
24.07.2013, 18:43
Цитата Сообщение от Hamlet Посмотреть сообщение
есть много .cpp файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его Глобальные Переменные. Можно и даже нужно использование какого нибудь утилита, который это умеет делать
Можно натравить на исходники clang и использовать его AST.
Небольшой пример использования libclang.
А парсер плюсов (не их подмножество, а с практически полной поддержкой стандарта) написать за небольшое время невозможно - я на написание препроцессора для этого курса убил овер 300 часов (особенно много времени пожрало понимание и реализация макросов). Впрочем, я сомневаюсь, что вам понадобиться вся мощь плюсового препроцессора.
1
Эксперт С++
4986 / 3093 / 456
Регистрация: 10.11.2010
Сообщений: 11,170
Записей в блоге: 10
24.07.2013, 22:28
Цитата Сообщение от ForEveR Посмотреть сообщение
Вот код из туториалов по clang-api
https://github.com/loarabia/Cl... orial6.cpp
Ищет глобальные не extern переменные.
Совершенно верно. Компилируется это дело через MinGW используя Clang 3.3 и Makefile так:
Кликните здесь для просмотра всего текста
Makefile
Bash
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
APP = main
CFL = -pipe -c -Wall -std=c++11 -pedantic -Id:/dev/clang/include
LFL = -pipe -s -Ld:/dev/clang/lib
SRC = $(APP).cpp
OBJ = $(SRC:.cpp=.o)
LIB = -lclang -lclangSerialization \
      -lclangFrontend -lclangParse -lclangSema -lclangEdit -lclangSerialization -lclangDriver -lclangCodeGen -lclangStaticAnalyzerFrontend -lclangStaticAnalyzerCheckers \
      -lclangStaticAnalyzerCore -lclangAnalysis -lclangRewriteCore -lclangRewriteFrontend -lclangAST -lclangLex -lclangBasic -lclangFormat -lLLVMSupport \
      -lLLVMJIT -lLLVMInterpreter -lLLVMAsmParser -lLLVMBitReader -lLLVMBitWriter -lLLVMCodeGen -lLLVMipo -lLLVMLinker -lLLVMSelectionDAG -lLLVMMCParser -lLLVMMC -ldbghelp
 
all: $(OBJ)
    g++ $(LFL) -o $(APP).exe $(OBJ) $(LIB)
 
%.o: %.cpp
    g++ $(CFL) $*.cpp -o $@
 
clean:
    @del $(OBJ)
    @del $(APP).exe
Обращаю внимание на то что библиотеки в Makefile подключаются именно в таком порядке.
Прикрепляю маленький EXE-шник (~ 10Mb) с примером.
Вложения
Тип файла: 7z 06_tut6.7z (2.59 Мб, 14 просмотров)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
24.07.2013, 22:28
Помогаю со студенческими работами здесь

Глобальные переменные
Как в C++ завести глобальную (общую для функции и самой программы) переменную?

Глобальные переменные
Доброго времени суток всем. У меня следующая проблема: объявляю глобально переменную типа структуры dealer* root;. Далее в коде...

Глобальные переменные
Объясните пожалуйста как правильно заводить глобальную переменную: static int k; или int k; в чем разница?

Глобальные переменные
Я хочу использовать глобальную переменную, определённую в main, в своих классах. Листинг)) globals.h #ifndef GLOBASL_H #define...

Глобальные переменные
Здравствуйте! Возникла видимо классическая проблема, но перечитав кучу сайтов так ее и не решил. Пишу в VS2005, имеются 2 срр файла...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
38
Ответ Создать тему
Новые блоги и статьи
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек SDL3 и Box2D из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия SDL 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual. . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru