我希望程序(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 ++文件中使用?
更多信息:
答案 0 :(得分:1)
我会在Clang的libtooling库的顶部构建这样的工具,因为它使您可以轻松访问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