【问题标题】:Eclipse CDT isConst checkEclipse CDT isConst 检查
【发布时间】:2020-09-01 10:53:55
【问题描述】:

我有一个简单的 Pointer.c 文件:

#include<stdio.h>

// Pointer To Constant
const int* ptrToConst ;


//Constant Pointer
int* const ConstPtr ;

当我通过 Eclipse CDT 解析它时:

File f = new File("C:/Data/Pointer.c");
IASTTranslationUnit ast = ASTProvider.getInstance().getASTWithoutCache(f);

for (IASTDeclaration d : ast.getDeclarations()) {

  IASTSimpleDeclaration sd = (IASTSimpleDeclaration) d;
  System.out.println("Variable Name: " + sd.getDeclarators()[0].getName());
  System.out.println("Is Constant: " + sd.getDeclSpecifier().isConst() + "\n");
}

输出是:

Variable Name: ptrToConst
Is Constant: true

Variable Name: ConstPtr
Is Constant: false

根据输出,指向常量的第一个变量被解析为constant,而另一个常量指针不是。我不明白这种行为,为什么会这样? CDT 对指针变量的理解不同吗?根据我的理解,输出应该是完全相反的。

在调试时检查变量 d 的第二种情况:

【问题讨论】:

  • for循环的行中设置断点,并找出抽象语法树(ast)中关于第二种情况的const修饰符的信息是保留的。
  • 我试过了,但我没有得到这样的信息。我们究竟在哪里可以调查它?已添加截图,请查收。谢谢!
  • 你看过declarators > [0] > pointerOps吗?
  • 刚刚检查过,它在pointerOps下正常运行!!非常感谢!能否请您解释一下原因?

标签: eclipse eclipse-cdt


【解决方案1】:

自从(见this answer

  • const int* ptrToConst 声明了一个指向常量整数
  • 的指针(可以修改)
  • int* const ConstPtr 声明了一个指向整数(可以修改)的常量指针

在第二种情况下,sd.getDeclSpecifier().isConst() 返回false

所以在第二种情况下,const 修饰符可以在pointer operators 在抽象语法树中更深找到(正如您自己发现的那样)。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-05-03
    • 2014-04-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-06-01
    • 2021-07-26
    • 2014-02-07
    相关资源
    最近更新 更多