在clang中确定VarDecl的宏展开 我是C++初学者,试图用CLAN把Objul-C代码擦掉。我知道宏是在AST访问节点和属性之前首先展开的

在clang中确定VarDecl的宏展开 我是C++初学者,试图用CLAN把Objul-C代码擦掉。我知道宏是在AST访问节点和属性之前首先展开的,c++,c,clang,oclint,C++,C,Clang,Oclint,我有一个名为NIL\u CHECK的宏,它在许多文件中使用。在执行lint时,我想跳过展开/使用该宏的行的变量声明 例如,本例中的第一行应该是lint,而第二行需要跳过,以便在进行宏扩展时不会抛出误报: // Must be checked NSDictionary *playerParams = @{ @"videoId" : videoId, @"playerVars" : playerVars }; // Must be skipped sinc

我有一个名为
NIL\u CHECK
的宏,它在许多文件中使用。在执行lint时,我想跳过展开/使用该宏的行的变量声明

例如,本例中的第一行应该是lint,而第二行需要跳过,以便在进行宏扩展时不会抛出误报:

// Must be checked
NSDictionary *playerParams = @{ @"videoId" : videoId, @"playerVars" : playerVars }; 

// Must be skipped since there's a macro
PlayerProfile *const playerProfile = [[PlayerProfile alloc] initWithData:NIL_CHECK(playerParams)]; 
下面是
VisitVarDecl
visitor方法,它遍历每个变量声明以执行适当的lint检查:

    bool VisitVarDecl(VarDecl *node) {
        if (isCollectionType(node -> getType()) && !hasTypeArguments(node -> getType())) {
            addViolation(node, this, description(node -> getNameAsString()));
        }
        return true;
    }
如何确定宏并跳过此类变量声明?

Valeriy给出了一个很好的答案,我认为它涵盖了您想要实现的目标

总结如下: 您希望在VarDecl中找到字符串
NIL\u CHECK
,该字符串在访问AST时已展开。源代码中的原始文本可以在
Lexer
的帮助下获得。可以使用完整varDecl expr的位置,也可以仅使用包含宏的零件。然后可以从Lexer的
getSourceText
返回的字符串中检测宏名。

是Valeriy的一个很好的答案,我认为它涵盖了您想要实现的目标

总结如下: 您希望在VarDecl中找到字符串
NIL\u CHECK
,该字符串在访问AST时已展开。源代码中的原始文本可以在
Lexer
的帮助下获得。可以使用完整varDecl expr的位置,也可以仅使用包含宏的零件。然后,可以从Lexer的
getSourceText
返回的字符串中检测宏名称