2

有什么方法可以编写一个方法来返回 C++ 文件中使用的所有指针变量名称。

例如:c++ 文件 (abc.cpp)

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

... ..

当我解析这个文件(abc.cpp)时,我应该在输出中得到两个变量。

  • 输出

emp1 标准 1

是否有一些内置方法/过程可以告诉变量的类型并仅列出变量的指针类型。

谢谢

4

4 回答 4

1

在 C++ 本身中没有内置的方法或过程来执行此操作。但是,您可以找到一个开源 c++ 解析器并使用它来执行此操作。

对此有一个堆栈溢出讨论:Good tools for creating a C/C++ parser/analyzer

于 2012-09-25T17:50:39.490 回答
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 回答
0

哪有这回事。您必须打开文件并解析其内容以找出您想要查找的内容。您可以使用Boost 正则表达式来执行此操作。

于 2012-09-25T17:51:13.760 回答