变量声明的部分名称

时间:2012-06-27 15:31:54

标签: c# c variables types

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

如果我有变量:

const unsigned char * volatile MyVariable;

变量名称为 MyVariable ,类型为 unsigned char 。什么是 const volatile 。它们是这种类型的一部分吗?

我必须用类来表示变量,我对如何构造它感到很遗憾。这就是我现在代表它的方式:

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将是这些关键字的数组(类型限定符)。非常感谢您的帮助。

3 个答案:

答案 0 :(得分:1)

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

constvolatilerestrict是“类型限定符”。例如,unsigned char非限定类型。限定符为编译器提供了有关如何处理内存的其他提示。它们几乎可以任意组合使用。

答案 1 :(得分:1)

constvolatile都是type qualifiers,尽管它们完全独立。

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

volatile限定符声明数据的值可以通过控制或检测编译器之外的方式更改,从而阻止编译器对代码应用任何优化(例如将对象的值存储在寄存器中)而不是记忆,它可能已经改变了。)

同时为constvolatile的变量意味着保证不会在当前代码中更改它,但这并不意味着它无法在外部更改。


编辑:作为旁注,unsigned是C中的类型修饰符,就像signedlong一样。
我建议除了类型本身(IsSignedIsUnsigned等之外,您还有IsLongintchar等独立类型字段。 )。

答案 2 :(得分:1)

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

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

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

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