在编译时间之前抓取常数值

Grabbing values of constants before compile time

本文关键字:抓取 常数值 编译 时间      更新时间:2023-10-16

我需要检查函数是否使用某些常数字符串,我将其称为 SpecialFunc,但这在我的示例中变得非常复杂。

假设我们有两个文件:

foo.h:

class Foo {                                                                    
public:                                                                        
    void RandomFunc();                                                         
private:                                                                       
    static constexpr auto SomeConst {"Buzz"};                                  
}; 

foo.cpp:

#include "Foo.h"                                                            
#include <string>                                                           
void Foo::RandomFunc() {                                                    
   SpecialFunc("Fizz");                                                     
   SpecialFunc(SomeConst);                                                  
   const std::string otherConst = "Bar";                                    
   SpecialFunc(otherConst);                                                 
}

我希望将FizzBuzzBar作为我的输出。

目前,我已经尝试使用正则表达式在Python中实施此功能来查找SpecialFunc,但是当您必须去搜索常数时,此实现变得非常混乱,很难处理,并且在范围内的问题更加混乱。Clang是我尝试解析一切的下一个选择,但我不确定是否有更好的方法。

最好的方法是什么?Python是我一直在尝试使用的当前语言,但我也愿意跳入另一种语言。

好吧,因为您不想使用正直,并且像在深层代码分析中一样提出问题,我现在建议使用(A的一部分)编译器来做词汇分析。这种方式非常艰难且耗时。但是您几乎可以分析有关代码的所有内容。您会学到很多。

因此,基本思想是编译器将您的C/C 代码带入称为AST(抽象语法树)的图。在该图中,您可以找到代表程序的不同"部分"的所谓令牌。

这个想法很简单:如果您告诉编译器您不希望在Lexer构建AST之前进行优化,那么您将找到字符串或将包含字符串的变量。因此,您必须采用AST,寻求所有相关功能,然后检查参数是字符串还是字符串变量。

几年前,我在Python软件包" Pycparser"方面做了类似的事情。

但是,我必须警告您,这将是很多工作。我强烈建议您问自己为什么要首先要这样做,并检查是否没有工具可以做您想做的事。