Форум программистов, компьютерный форум CyberForum.ru
Наши страницы

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 14, средняя оценка - 4.71
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
#1

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

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

у меня вот такая задача
Дано много .срр файлов, которые являют собой полноценные программы со своими мейнами. Нужно найти для каждого файла его глобальные переменные. Приветствуются отсылки к каким-нибудь утилитам, которые это умеют делать
парсер писать не реально
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
23.07.2013, 21:09
Здравствуйте! Я подобрал для вас темы с ответами на вопрос нужно найти Глобальные Переменные в .срр файле (C++):

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

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

Глобальные переменные - C++
Подскажите пожалуйста, почему данные в глобальной переменной перезаписываются, а не плюсуются? Пример: int peremennaya; void...

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

глобальные переменные - C++
Пробовал объявить глобальные переменные следующим образом: в заголовочном файле head.h #ifndef DF_H #define DF_H //объявления...

Глобальные переменные - C++
Здравствуйте . Разбираю пример с книги на использование глобальных переменных . Там был такой пример: #include "stdafx.h" #include...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 09:33  [ТС] #16
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
void find_global_variables(const string& filename)
{
    
    vector<string> keywords;
    keywords.push_back("struct");
    keywords.push_back("union");
    keywords.push_back("namespace");
    keywords.push_back("class");
    keywords.push_back("enum");
    keywords.push_back("typedef");
    keywords.push_back("using");
    ifstream ifs(filename);
    string s;
    stack<char> scopes;
    while (getline(ifs, s))
    {
        if (s.find("{") != std::string::npos)
        {
             scopes.push('{');
        }
        else if (s.find("}") != std::string::npos)
        {
             scopes.pop();
        }
        if (!scopes.empty())
        {
             continue;
        }
        bool is_global = true;
        for (vector<string>::iterator iter = keywords.begin(); iter != keywords.end(); iter++)
        {
           size_t idx = s.find(*iter);
           if (idx != string::npos)
           {
             size_t end_idx = idx + iter->length();
             if (s[end_idx] != ' ')
             {
                 continue;
             }
             else
             {
                 is_global = false;
                 break;
             }
           }
        }
        if (s.find(";") != string::npos && s.find("(") == string::npos && s.find("#") == string::npos
            && s.find("{") == string::npos && s.find("}") == string::npos)
       {
         if (is_global)
         {
            cout << "Global: " << s << endl;
         }
       }
   }
}
код будет примерно вот такой, я уже это попытался сделать
но что вы скажете в этом случе

Добавлено через 47 секунд
C++
1
2
3
4
5
6
7
8
9
10
11
12
class SS
{
public:
    int x;
    SS(int w)
    {
        x=w;
    }
};
int dop=9;
//typedef int dop;
SS s(dop);
Добавлено через 5 минут
Цитата Сообщение от gray_fox Посмотреть сообщение
Flassie,
Если уж на то пошло, надо файл через препроцессор прогнать для начала...
+
а как это реализовать правильно?
0
Tulosba
:)
Эксперт С++
4396 / 3239 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
24.07.2013, 09:53 #17
Цитата Сообщение от Hamlet Посмотреть сообщение
а как это реализовать правильно?
Запустить компилятор с нужными ключами. Чтобы выдал выхлоп препроцессора, а не бинарный код.
А по теме, кстати, много чего гуглится на стэковерфлоу. В частности предлагают doxygen натравить.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 10:00 #18
А какая разница, есть ли там шаблоны, классы, инклуды и прочая лабуда? Просто ищем переменную и смотрим в каком она скопе.
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.07.2013, 11:15 #19
Можно поюзать clang-api, правда без ста грамм не разобраться.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 11:30 #20
Цитата Сообщение от ForEveR Посмотреть сообщение
Можно поюзать clang-api, правда без ста грамм не разобраться.
Можно отсюда оттолкнуться: http://habrahabr.ru/post/148508/
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.07.2013, 13:21 #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
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 13:30 #22
А меня на такой.
Кликните здесь для просмотра всего текста
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
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.07.2013, 14:07 #23
castaway, 3.2 да. Твой код явно интереснее и чище.

Добавлено через 31 минуту
Вот код из туториалов по clang-api
https://github.com/loarabia/Clang-tu...Itutorial6.cpp
Ищет глобальные не extern переменные.
0
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 14:25 #24
Кстати, код, который я привел, тоже оттуда. Я лишь внес незначительные изменения.
0
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 15:41  [ТС] #25
ниужели не у кого нет рабочего кода?
0
castaway
24.07.2013, 15:59
  #26

Не по теме:

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

0
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:01  [ТС] #27
Цитата Сообщение от 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
castaway
Эксперт С++
4884 / 3020 / 370
Регистрация: 10.11.2010
Сообщений: 11,078
Записей в блоге: 10
Завершенные тесты: 1
24.07.2013, 17:03 #28
Hamlet, этот код для Clang версии 3.3
0
Hamlet
0 / 0 / 0
Регистрация: 23.07.2013
Сообщений: 11
24.07.2013, 17:07  [ТС] #29
а clang это компилятор, что ли?
0
ForEveR
В астрале
Эксперт С++
7972 / 4734 / 321
Регистрация: 24.06.2010
Сообщений: 10,541
Завершенные тесты: 3
24.07.2013, 17:08 #30
Hamlet, Да. С добрым утром. Если вы серьезно думаете, что кто-то будет вам писать такую программу просто так + к тому даже не пытаетесь погуглить/попробовать узнать, что за варианты тут представлены, то вы сильно ошибаетесь.
0
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2013, 17:08
Привет! Вот еще темы с ответами:

глобальные переменные - C++
здравствуйте, я только начал изучать C++, в книге Штидта Г. есть такой код, он выводит: count + число, помогите понять принцип работы этого...

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

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

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


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

Или воспользуйтесь поиском по форуму:
Yandex
Объявления
24.07.2013, 17:08
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru