哪些情况会导致对c++代码进行原始变量的简单搜索失败?
What cases will cause a naive search of C++ code for primitive variables to fail?
如果我遍历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())
当然还有其他人提到的问题;类型定义/类型别名、宏、嵌套声明、多重声明等
- std::move 如何使原始变量的值无效?
- 如果包含引用成员的类中缺少原始变量,为什么它仍然可以访问?
- 如何从字符串变量为正则表达式构建原始字符串
- 是否可以保证浮点变量的副本将按位等效于原始副本?
- 为什么存储在变量中的值比原始答案少 1?
- 在C++中使用多线程时,是否可以读取半写的、损坏的原始变量?
- 如何将变量用作原始 JSON 字符串中的数据?
- #defined 函数只能接受原始输入而不接受变量?
- C 为什么在原始双阵列中的分配似乎比双变量分配要快得多
- 我应该重置Destructor中的原始成员变量
- C++ 如何更改函数中原始变量的值
- 带有布尔转换的变量的原始打印:意外行为
- 带有原始指针的boost :: shared_ptr变量的条件初始化
- 使用 const_cast<> 并更改地址处的值不会更改原始变量
- 重载运算符保持变量更新,而不是保持原始变量
- 在C++中使用别名而不更改原始变量的值
- 绑定C++成员变量:getter/setter 或原始指针
- 如何修改通过值传递的原始变量的内容
- 如果使用引用的目的是更改原始变量的值,为什么要使用 const 引用传递?[C++]
- [C++传递值]:被调用函数是否可以修改原始变量的内容