1

我正在尝试从使用 C# 编译的 C 程序中提取调试信息,并且需要存储全局变量。

如果我有变量:

const unsigned char * volatile MyVariable;

变量的名称是MyVariable,类型是unsigned char。什么是constvolatile。它们是类型的一部分吗?

我必须用一个类来表示一个变量,而我不知道如何构造它。这就是我现在的表现方式:

public class MyVariable
{
     public string Name;
     public string Type;

     public bool IsArray;
     public bool IsPointer;
     public bool IsConstant;
     public bool IsVolatile;
     // etc...

     public int Size; // in bytes
}

我应该成为类型的一部分吗volatileconst这些是什么?属性?

编辑

抱歉,我认为我没有正确解释自己。我的问题应该是我应该如何构造 MyVariable 类我知道 const 关键字对变量以及 volatile 的作用。例如,当我创建一个将由多个线程访问的变量时,我使用了 volatile 关键字。

无论如何,根据答案,我应该将我的课程构建为:

public class MyVariable
{
     public string Name;
     public string Type;

     public string[] TypeQualifiers;

     public int Size; // in bytes
}

其中 TypeQualifiers 将是这些关键字(类型限定符)的数组。非常感谢您的帮助。

4

3 回答 3

1

你的项目会给你带来一些麻烦,因为你显然不是很熟悉 C,最重要的是,手头没有好的语言参考......

const,volatile并且restrict是“类型限定符”。例如,unsigned char是一个不合格的类型。限定符为编译器提供了有关如何处理内存的额外提示。它们几乎可以以任何组合连接。

于 2012-06-27T15:51:32.973 回答
1

const并且volatile都是类型限定符,尽管它们是完全独立的。

const关键字指定不能在代码中更改对象或变量。

限定符声明数据可以以volatile编译器无法控制或检测的方式更改其值,从而阻止编译器对代码应用任何优化(例如将对象的值存储在寄存器而不是内存中,它可能有改变)。

一个既是constvolatile意味着在当前代码中保证不会被改变的变量,但这并不意味着它不能在外部被改变。


编辑:作为旁注,unsigned是 C 中的类型修饰符,就像signedand一样long。我建议你也有独立的类型字段,
比如IsSigned,除了类型本身(, , 等等...)。IsUnsignedIsLongintchar

于 2012-06-27T15:58:17.033 回答
1

首先阅读最新在线C 标准的第 6.7 节(声明) 。

您将很难在诸如示例中的平面数据结构中捕获 C 声明语法的所有细微差别。“类型”的概念可能会变得非常复杂,例如

int *(*(*f[N])())[M];

其中f类型为“指向函数的 N 元素指针数组,返回指向指向 M 元素指针数组的指针int”。您可能永远不会在实际代码中看到任何令人讨厌的东西,但它说明了从声明中提取类型信息的难度。

于 2012-06-27T16:18:04.733 回答