我有以下简单的C代码
int result1 = 1;
int result2 = 2;
void *p[] =
{
&result1,
&result2
};
result1和result2用其地址初始化p数组。 AST转储,使用clang,此代码是:
TranslationUnitDecl 0x5581fd31a1d8 <<invalid sloc>> <invalid sloc>
|-VarDecl 0x5581fd31ae68 <1.c:2:1, col:15> col:5 used result1 'int' cinit
| `-IntegerLiteral 0x5581fd373e40 <col:15> 'int' 1
|-VarDecl 0x5581fd373e78 <line:3:1, col:15> col:5 used result2 'int' cinit
| `-IntegerLiteral 0x5581fd373ed8 <col:15> 'int' 2
`-VarDecl 0x5581fd373f50 <line:5:1, line:9:1> line:5:7 p 'void *[2]' cinit
`-InitListExpr 0x5581fd3740c0 <line:6:1, line:9:1> 'void *[2]'
|-ImplicitCastExpr 0x5581fd374100 <line:7:5, col:6> 'void *' <BitCast>
| `-UnaryOperator 0x5581fd374008 <col:5, col:6> 'int *' prefix '&'
| `-DeclRefExpr 0x5581fd373fb0 <col:6> 'int' lvalue Var 0x5581fd31ae68 'result1' 'int'
`-ImplicitCastExpr 0x5581fd374120 <line:8:5, col:6> 'void *' <BitCast>
`-UnaryOperator 0x5581fd374050 <col:5, col:6> 'int *' prefix '&'
`-DeclRefExpr 0x5581fd374028 <col:6> 'int' lvalue Var 0x5581fd373e78 'result2' 'int'
在ast转储中,我们可以看到p具有cinit属性(带有赋值的C样式初始化。),但是初始化器是它的子代。 我想知道是否有使用clang API的“简便”方法为此类cinit节点获取对其进行初始化的子级? 初始化此节点的节点不是其子节点,而是后代。
我不想检查每个DeclRefExpr的父母之一是否具有cinit属性。在大型代码库中,它可能会影响AST遍历性能。