在编译时间之前抓取常数值
Grabbing values of constants before compile time
我需要检查函数是否使用某些常数字符串,我将其称为 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);
}
我希望将Fizz
,Buzz
和Bar
作为我的输出。
目前,我已经尝试使用正则表达式在Python中实施此功能来查找SpecialFunc
,但是当您必须去搜索常数时,此实现变得非常混乱,很难处理,并且在范围内的问题更加混乱。Clang是我尝试解析一切的下一个选择,但我不确定是否有更好的方法。
最好的方法是什么?Python是我一直在尝试使用的当前语言,但我也愿意跳入另一种语言。
好吧,因为您不想使用正直,并且像在深层代码分析中一样提出问题,我现在建议使用(A的一部分)编译器来做词汇分析。这种方式非常艰难且耗时。但是您几乎可以分析有关代码的所有内容。您会学到很多。
因此,基本思想是编译器将您的C/C 代码带入称为AST(抽象语法树)的图。在该图中,您可以找到代表程序的不同"部分"的所谓令牌。
这个想法很简单:如果您告诉编译器您不希望在Lexer构建AST之前进行优化,那么您将找到字符串或将包含字符串的变量。因此,您必须采用AST,寻求所有相关功能,然后检查参数是字符串还是字符串变量。
几年前,我在Python软件包" Pycparser"方面做了类似的事情。
但是,我必须警告您,这将是很多工作。我强烈建议您问自己为什么要首先要这样做,并检查是否没有工具可以做您想做的事。
相关文章:
- 为什么这个加载函数只抓取文件中的第一件事?
- 无法使用 OpenCv 3.4.5 从具有C++ dll 的网络摄像机 (rtsp) 中抓取帧
- 如何从日志文件中抓取状态代码?(在 C++ 中)
- DXGI API:AcquireTextFrame()从不抓取更新的图像,始终为空
- C++表达式必须具有常数值
- 表达式必须具有常数值,变量不能用作定义数组大小的常数
- C++重载|(按位OR)运算符,返回常数值
- 如何从 avi 文件中抓取所有帧 - 如何修改 MS 样本采集卡样本
- 如何抓取指向Qt中弹出对话框的指针,该对话框阻止了QTest中的UI线程
- 为什么抓取窗口标题的代码会导致应用崩溃?
- 用Xcb而不是Xlib抓取像素的颜色
- 如何在C ++(qt)代码中使用python脚本?(网页抓取方面)
- 确定LLVM中的常数值
- OpenCV 3.2 在抓取时提供选择超时,但 fscyber 可以工作
- 使用 Matrox 进行帧抓取
- C++生产者使用者中,同一使用者线程会抓取所有任务
- 在编译时间之前抓取常数值
- 如何基于用户设置的初始变量设置一组常数值
- OpenCV + QML(从另一个线程抓取帧)
- C++:在函数内部声明数组时,表达式必须具有常数值