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

C++ 检查cpp文件中是否使用了变量,c++,variables,exists,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;

我希望让我的程序(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的内容(我当前解决此任务的尝试)

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

<>强>有没有一种实用的方法来确定变量是否存在或在C++文件中使用?<强> < /P> 进一步资料:

  • 在我的例子中,a变量总是双变量
  • 搜索声明“double a#”不是一个选项,因为变量可以通过其他方式声明-事实上,它们甚至不必声明,因为它们可能首先在编译时定义
  • a变量可以在其他函数中声明/使用,也可以在code.cpp中作为全局变量声明/使用
  • 无法搜索空格,因为算法还应检测“a3=a1*a2”中的三个变量

我会在库的顶部构建这样一个工具,因为它可以让你轻松地访问C++解析器,并能轻松地搜索AST,不管你的心有多么渴望。也许更容易把它写成一个支票。

< p>我会在库的顶部构建这样一个工具,因为这可以让你轻松地访问C++解析器,并且能够轻松地搜索AST,不管你的心有多么渴望。也许更容易把它写成一个检查。

正如杰斯珀所提到的,你需要一个C++解析器。为了确定变量是否存在或在C++文件中使用,最简单的方法是使用CLANAST匹配器,而不是自己实现工具。 因此,安装LLVM、Clang、Clang工具和fire Clang查询:

$ 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匹配器的引用

< P>,你需要一个C++解析器。为了确定变量是否存在或在C++文件中使用,最简单的方法是使用CLANAST匹配器,而不是自己实现工具。 因此,安装LLVM、Clang、Clang工具和fire Clang查询:

$ 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参考

大多数编译器已经发出了关于未使用的变量或参数的警告。我不认为有必要亲自做这件事。这不是警告未使用的变量或参数的目的。我故意忽略了代码的用途,因为这有点像兔子洞,但简而言之,我打算不声明code.cpp中的a变量,并通过命令行声明它们,作为我的一个更大的动态编译项目的一部分。然后,您应该遵循Jesper答案中的建议,或者至少用正则表达式来做自己的方法,但是要注意,在解析正确的C++语法时,后者仍然是非常有限的。大多数编译器已经发出了关于未使用的变量或参数的警告。我不认为有必要亲自做这件事。这不是警告未使用的变量或参数的目的。我故意忽略了代码的用途,因为这有点像兔子洞,但简而言之,我打算不声明code.cpp中的a变量,并通过命令行声明它们,作为我的一个更大的动态编译项目的一部分。然后,您应该遵循Jesper答案中的建议,或者至少用正则表达式来做自己的方法,但是要注意,在解析正确的C++语法时,后者仍然是非常有限的。
$ 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.