编译前获取常量值

2024-03-28 22:04:30 发布

您现在位置:Python中文网/ 问答频道 /正文

我需要检查函数是否使用了某些常量字符串,在我的示例中,我将其称为SpecialFunc,但这变得非常复杂,超出了一般情况。你知道吗

假设我们有两个文件:

食物:

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,但是当您必须开始搜索常量时,这个实现变得非常混乱,并且很难处理,并且在范围界定问题上变得更加混乱。叮当声是我下一个尝试解析一切的选项,但我不确定是否有更好的方法。你知道吗

最好的办法是什么?Python是目前我一直在尝试使用的语言,但我也愿意跳到另一种语言。你知道吗


Tags: 文件函数语言stringfooincludebar常量
1条回答
网友
1楼 · 发布于 2024-03-28 22:04:30

好吧,既然你不想使用RegEx,你的问题就像你想在深层代码分析中做的那样,我现在建议你使用(部分)编译器来做词法分析。这种方法很费时费力。但是你可以分析几乎所有关于你的代码的东西。你会学到很多。你知道吗

基本的想法是编译器采用C/C++代码,首先把它引入一个叫做AST(抽象语法树)的图形。在该图中,您可以找到表示程序不同“部分”的所谓标记。你知道吗

想法很简单:如果在lexer构建AST之前告诉编译器您不希望进行优化,那么您将找到字符串或包含字符串的变量。所以你必须采取AST,寻找所有相关的函数,然后检查参数是否是字符串或字符串的变量。你知道吗

几年前,我对python包“pycparser”做了类似的工作。你知道吗

不过,我必须警告你,这将是一个很大的工作。我强烈建议你首先问问自己为什么要这么做,并检查是否有可用的工具来做你想做的事情。你知道吗

相关问题 更多 >