我试图用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
}
我应该将volatile
和const
部分归类吗?这些是什么?属性?
对不起,我想我没有正确解释自己。 我的问题应该是我应该如何构建MyVariable类我知道const关键字对变量以及volatile的作用。我在创建一个将由多个线程访问的变量时使用volatile关键字。
无论如何,基于答案,我应该将我的课程构建为:
public class MyVariable
{
public string Name;
public string Type;
public string[] TypeQualifiers;
public int Size; // in bytes
}
其中TypeQualifiers将是这些关键字的数组(类型限定符)。非常感谢您的帮助。
答案 0 :(得分:1)
Yout项目会给你带来一些麻烦,因为你显然不是很熟悉C,最重要的是,没有一个好的语言参考...
const
,volatile
和restrict
是“类型限定符”。例如,unsigned char
是非限定类型。限定符为编译器提供了有关如何处理内存的其他提示。它们几乎可以任意组合使用。
答案 1 :(得分:1)
const
和volatile
都是type qualifiers,尽管它们完全独立。
const
关键字指定无法在代码中更改对象或变量。
volatile
限定符声明数据的值可以通过控制或检测编译器之外的方式更改,从而阻止编译器对代码应用任何优化(例如将对象的值存储在寄存器中)而不是记忆,它可能已经改变了。)
同时为const
和volatile
的变量意味着保证不会在当前代码中更改它,但这并不意味着它无法在外部更改。
编辑:作为旁注,unsigned
是C中的类型修饰符,就像signed
和long
一样。
我建议除了类型本身(IsSigned
,IsUnsigned
等之外,您还有IsLong
,int
和char
等独立类型字段。 )。
答案 2 :(得分:1)
首先阅读最新在线C Standard的第6.7节(声明)。
您将很难在平面数据结构中捕获C声明语法的所有细微差别,例如在您的示例中。 “类型”的概念可能变得相当复杂,例如
int *(*(*f[N])())[M];
其中f
具有类型“指向函数的指针的N元素数组,返回指向指向int
的指针的M元素数组的指针”。您可能永远不会在实际代码中看到任何令人讨厌的东西,但它说明了从声明中提取类型信息的难度。