2

C++ファイルで使用されているすべてのポインター変数名を返すメソッドを作成する方法はありますか?

例:c ++ファイル(abc.cpp)

.......
//some code here
.....
emp* emp1 = do_something();
int a = 10;
student* std1 = getdata();

....。

このファイル(abc.cpp)を解析すると、出力に2つの変数が含まれるはずです。

  • 出力

emp1 std1

変数の型を示し、変数のポインタ型のみをリストする組み込みのメソッド/プロシージャはありますか?

ありがとう

4

4 に答える 4

1

C++ 自体でこれを行う組み込みのメソッドまたはプロシージャはありません。ただし、オープン ソースの C++ パーサーを見つけて、それを使用してこれを行うことができます。

これに関するスタック オーバーフローの議論があります: C/C++ パーサー/アナライザーを作成するための優れたツール

于 2012-09-25T17:50:39.490 に答える
0

そのようなことはない。ファイルを開いてその内容を解析し、知りたいことを見つける必要があります。Boost 正規表現を使用してこれを行うことができます。

于 2012-09-25T17:51:13.760 に答える
0

確かに、標準の C++ ツールではそれを行うことはできません。仕事をするための私のアルゴリズムは次のようになります。

  1. .cpp 全体を std::string に読み込みます。

    std::ifstream ifs("filename.cpp");
    std::string str((std::istreambuf_iterator<char>(ifs)), 
                     std::istreambuf_iterator<char>());
    
  2. 「*」記号と「=」記号の間に配置されたその文字列内のすべての文字列を検索し、それらを配列 std::vector に配置します。これは非常に大まかなアルゴリズムですが、単純なタスクには適しています。

  3. この配列内のすべての文字列について、すべての空白を削除します。
  4. すべての配列要素を出力します。
于 2012-09-25T17:59:03.517 に答える
0

コードは次のとおりです。

#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
#include <vector>
#include <set>
#include <cctype>

using namespace std;

vector< string > types;
set< string > names;

int main() {
    types.push_back( "int" );
    types.push_back( "char" );
    types.push_back( "float" );
    types.push_back( "double" );
    types.push_back( "bool" );
    types.push_back( "unsigned" );
    types.push_back( "long" );
    types.push_back( "short" );
    types.push_back( "wchar_t" );

    // ect

    fstream in( "input.cpp", fstream::in );
    string row;
    string tmp;

    while( in >> tmp ) {
        if( tmp == "struct" || tmp == "class" ) {
            in >> tmp;
            string::iterator it = find( tmp.begin(), tmp.end(), '{' );
            tmp.erase( it, tmp.end() );
            types.push_back( tmp );
        }
        row += tmp;
    }

    for( int i=0; i<types.size(); ++i ) {
        int it=-1;

        while( ( it=row.find( types[ i ], it+1 ) ) ) {
            if( it == -1 ) break;
            int spos;
            for( spos=it; row[ spos ] != '*'; ++spos );
            spos++;

            string ptr;

            while( ( isalnum( ( int )row[ spos ] ) || row[ spos ] == '_' ) && spos < row.size()  ) {
                ptr += row[ spos ];
                spos++;
            }

            names.insert( ptr );
        }
    }

    for( set< string >::iterator i=names.begin(); i!=names.end(); ++i ) {
        cout << *i << " ";
    }


    return 0;
} 

私が基本的に行うことは、入力プログラム全体をスペースなしで行に配置し、ユーザー定義の構造体またはクラスをチェックして、型ベクトルに挿入し、最後に、型ベクトルに何かが存在する場合は各型を検索することです。行のフォーム<type>*。それから、私はそれを印刷します。

于 2012-09-25T18:31:54.273 に答える