检查函数是否为虚函数
Check if a function is virtual
有没有办法从 Eclipse CDT 的 AST 中检查一个函数是否为虚函数?
我试图通过在 ICPPASTFunctionDeclarator 节点上使用访问者来执行这种检查。它有以下方法:isOverride()、isPureVirtual()、isFinal()等。 isVirtual() 之类的东西丢失了。
C++ 语法有些古怪。其中之一是 function declarator 产生式仅涵盖从函数名称开始的函数声明部分(从技术上讲,它还包括任何 pointer operators 来自函数 return 类型,在函数名称之前),并在函数声明的末尾(或函数体的开头)结束。
函数的 return 类型(同样,指针运算符 除外)和声明开头的其他说明符(包括 virtual
)是称为 decl-specifier.
的兄弟节点的一部分
因此,如果您的起点是 函数声明符 ,则必须通过其父项导航到 decl-specifier。父级可以是 简单声明 (在没有主体的函数声明的情况下)或 函数定义 (有主体的声明),并且你必须检查每个案例。
一旦你有了 decl-specifier,你可以使用 ICPPASTDeclSpecifier.isVirtual()
.
检查虚拟
在代码中:
// declarator is your ICPPASTFunctionDeclarator
ICPPASTDeclSpecifier declSpec = null;
if (declarator.getParent() instanceof IASTSimpleDeclaration) {
declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) declarator.getParent()).getDeclSpecifier();
} else if (declarator.getParent() instanceof IASTFunctionDefinition) {
declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition) declarator.getParent()).getDeclSpecifier();
}
if (declSpec != null) {
boolean isVirtual = declSpec.isVirtual();
}
最后请注意,上面告诉你的是virtual
关键字是否出现在函数的声明中。
如果一个函数在其声明中没有 virtual
关键字,则它可以是虚函数,如果它是派生 class 中的函数覆盖基 class 中的虚函数。
如果你真正想知道函数是不是虚函数,即使不使用virtual
关键字,那也比较复杂。我认为使用 CDT 的 public API 没有简单的方法,但如果您愿意使用内部 API,它会变得更容易。如果您对此感兴趣,请告诉我,我可以提供更多详细信息。
有没有办法从 Eclipse CDT 的 AST 中检查一个函数是否为虚函数?
我试图通过在 ICPPASTFunctionDeclarator 节点上使用访问者来执行这种检查。它有以下方法:isOverride()、isPureVirtual()、isFinal()等。 isVirtual() 之类的东西丢失了。
C++ 语法有些古怪。其中之一是 function declarator 产生式仅涵盖从函数名称开始的函数声明部分(从技术上讲,它还包括任何 pointer operators 来自函数 return 类型,在函数名称之前),并在函数声明的末尾(或函数体的开头)结束。
函数的 return 类型(同样,指针运算符 除外)和声明开头的其他说明符(包括 virtual
)是称为 decl-specifier.
因此,如果您的起点是 函数声明符 ,则必须通过其父项导航到 decl-specifier。父级可以是 简单声明 (在没有主体的函数声明的情况下)或 函数定义 (有主体的声明),并且你必须检查每个案例。
一旦你有了 decl-specifier,你可以使用 ICPPASTDeclSpecifier.isVirtual()
.
在代码中:
// declarator is your ICPPASTFunctionDeclarator
ICPPASTDeclSpecifier declSpec = null;
if (declarator.getParent() instanceof IASTSimpleDeclaration) {
declSpec = (ICPPASTDeclSpecifier) ((IASTSimpleDeclaration) declarator.getParent()).getDeclSpecifier();
} else if (declarator.getParent() instanceof IASTFunctionDefinition) {
declSpec = (ICPPASTDeclSpecifier) ((IASTFunctionDefinition) declarator.getParent()).getDeclSpecifier();
}
if (declSpec != null) {
boolean isVirtual = declSpec.isVirtual();
}
最后请注意,上面告诉你的是virtual
关键字是否出现在函数的声明中。
如果一个函数在其声明中没有 virtual
关键字,则它可以是虚函数,如果它是派生 class 中的函数覆盖基 class 中的虚函数。
如果你真正想知道函数是不是虚函数,即使不使用virtual
关键字,那也比较复杂。我认为使用 CDT 的 public API 没有简单的方法,但如果您愿意使用内部 API,它会变得更容易。如果您对此感兴趣,请告诉我,我可以提供更多详细信息。