哪些情况会导致对c++代码进行原始变量的简单搜索失败?

What cases will cause a naive search of C++ code for primitive variables to fail?

本文关键字:变量 原始 简单 失败 搜索 代码 情况 c++      更新时间:2023-10-16

如果我遍历c++源文件并简单地查找变量类型后面跟着正确的c++变量名,是否存在导致丢失变量或假变量的情况,需要适当的解析器来克服?

一个简单的测试用例正确地抓取了所有的原语,但是如果有很多我没有考虑到的无关的用例,我宁愿不投入太多的时间。到目前为止,我只是查找关键字,获取下一个单词并检查名称的有效性。除了检查变量名的有效性外,我不使用正则表达式,并且我理解正则表达式不足以进行解析。

我的程序是用Java写的。我编写了这个程序的Java目标版本,并使用了运行良好的JavaParser。我认为ANTLR或其他类似的东西对于在源中查找原始变量来说是多余的。

您尝试过在一行声明多个变量吗?

int i, *j, k[2];

函数参数声明呢?

int func(int i, int j);

typedefs呢?

typedef int Integer;
Integer i;

没有适当的解析器(而且相当复杂)解析c++是困难的。

函数参数,在同一行声明的多个变量,类型和变量名在单独的行,等等?

基本的c++声明语法不是简单的从左到右的<type> <identifier>语法。

如果这是c++的语法,那么,例如,声明一个int型数组应该使用int[]类型,后跟一个标识符:

int[] foo

声明一个函数意味着写一个函数类型,如int(),后面跟着一个标识符:

int() foo;

c++的语法,继承自C语言,是一种叫做"声明模仿使用"的风格

<type_identifier> <expression>;

声明中的表达式看起来就像你可以使用声明实体的一种方式,这种用法将产生指定的类型。

例子:

int i;      // now the expression i has the type int
int (ii);   // now the expression (ii) has the type int, and so ii has the same type
int j();    // now the expression j() has type int, and therefore j has a function type
int k[3];   // now the expression k[3] has type int, and therefore k has an array type
int (*l)(); // the expression (*l)() has type int, and therefore (*l) has a function type, therefore l has a pointer-to-function type.

等等,包括数组索引操作符,函数调用操作符,父操作符,解引用操作符,位和操作符,可能还有一些我不记得了。此外,const和volatile可以在不同的位置抛出。

更糟糕的是,声明语法可能与初始化项的语法发生奇怪的交互。例如,"最令人烦恼的解析"是一种情况,即来自初始化器的父类与声明函数类型所涉及的父类混淆。父类是类型表达式的一部分还是初始化式的一部分,可以取决于它内部使用的名称:

struct bar {};
int baz() { return 1; }
int foo(bar());  // declaration of function (most vexing parse)
int foo2(baz()); // declaration of variable (initialized with baz())

当然还有其他人提到的问题;类型定义/类型别名、宏、嵌套声明、多重声明等