检查cpp文件中是否使用了变量

时间:2018-07-29 09:14:55

标签: c++ variables exists

我希望程序(main.cpp)读取一个cpp文件(code.cpp),并确定是否使用了某些变量。可以通过读取文件并搜索子字符串来轻松完成此操作,但这具有不希望的缺点,如下所述。

code.cpp的内容

double a4 = 4.0;
int main() {
    double a1 = 1.0;
    double a2 = 2.0; 
    //a3 is inside comment. Therefore a3 does not exist
    double a33 = 3.0; //a33 exists. a3 does not exist
    string s = "a1a2a3"; //a3 still does not exist
    return 0;
}

main.cpp的内容(我当前解决此任务的尝试)

#include <iostream>
#include <fstream>
using namespace std;

int main() {
    std::ifstream file;
    file.open("code.cpp");
    std::string s;
    while(std::getline(file,s)){
        if (s.find("a1") != std::string::npos)
            cout << "found a1" << endl;
        if (s.find("a2") != std::string::npos)
            cout << "found a2" << endl;
        if (s.find("a3") != std::string::npos)
            cout << "found a3 :(" << endl;
        if (s.find("a4") != std::string::npos)
            cout << "found a4" << endl;
    }
    return 0;
}

主要执行的输出:

found a4
found a1
found a2
found a3 :(
found a3 :(
found a1
found a2
found a3 :(

main.cpp不成功,因为它检测到a3是code.cpp中使用的变量。

是否有任何实用的方法来确定某些名称的变量是否存在或是否在c ++文件中使用?

更多信息:

  • 就我而言,a变量始终是双精度的
  • 搜索声明“ double a#”不是一种选择,因为可以通过其他方式声明该变量-实际上,甚至不必声明它们,因为它们可能是在编译时首先定义的。
  • a变量可以在其他函数中声明/使用或在code.cpp中用作全局变量
  • 无法搜索空格,因为该算法还应该检测“ a3 = a1 * a2”中的三个变量

2 个答案:

答案 0 :(得分:1)

我会在Clanglibtooling库的顶部构建这样的工具,因为它使您可以轻松访问C ++解析器,并能够轻松搜索AST以查找您的心脏需求。也许更容易将其写为ClangTidy支票。

答案 1 :(得分:0)

正如Jesper所说,您需要一个C ++解析器。要确定某些名称的变量是否存在或已在c ++文件中使用,最简单的方法是使用Clang AST Matcher,而不是自己实现工具。

因此,请安装LLVM,Clang,Clang工具并启动clang-query:

$ clang-query yourcode.cpp
clang-query> match varDecl(hasName("a1"))
Match #1:
/home/yourcode.cpp:3:5: note: "root" binds here
    double a1 = 1.0;
    ^~~~~~~~~~~~~~~
1 match.
clang-query> match varDecl(hasName("a2"))
Match #1:
/home/yourcode.cpp:4:5: note: "root" binds here
    double a2 = 2.0; 
    ^~~~~~~~~~~~~~~
1 match.
clang-query> match varDecl(hasName("a3"))
0 matches.
clang-query> match varDecl(hasName("a4"))
Match #1:
/home/yourcode.cpp:1:1: note: "root" binds here
double a4 = 4.0;
^~~~~~~~~~~~~~~
1 match.

您可以做很多事情,请查看AST Matcher参考http://clang.llvm.org/docs/LibASTMatchersReference.html