我有一个结构,我想使变量相互关联。这里是一段代码:相关结构变量?
struct RSI
{
int RSI;
int ESI = RSI & 0x1F;
int SI = ESI & 0x0F;
int SIL = SI & 0x08;
};
有没有办法在C中做到这一点,而不必创建函数来修改变量?
我有一个结构,我想使变量相互关联。这里是一段代码:相关结构变量?
struct RSI
{
int RSI;
int ESI = RSI & 0x1F;
int SI = ESI & 0x0F;
int SIL = SI & 0x08;
};
有没有办法在C中做到这一点,而不必创建函数来修改变量?
不,你需要定义函数来做到这一点。
在C++中,你当然可以封装细节:
struct RSI
{
private:
int rsi;
public:
RSI(int rsi) : rsi(rsi) {}
int getRSI() const { return rsi; }
int getESI() const { return getRSI() & 0x1F; }
int getSI() const { return getESI() & 0x0F; }
int getSIL() const { return getSI() & 0x08; }
};
您的答案“否”适用于C,但您的代码显示C++在哪里这实际上是可能的(不是我通常会建议它)。这是什么? – 2011-12-28 17:02:34
哇,我要非常感谢你:) – iDomo 2011-12-28 17:02:38
@KonradRudolph:我说这是不可能没有函数,但在C++中,细节可以被封装。 – 2011-12-28 17:03:23
号这正是为什么变量通常与微胶囊的方法的原因。
在您的特定情况下,你可以这样写:
union RSI_t
{
int RSI;
int ESI : 5;
int SI : 4;
int SIL : 3;
};
这是不可移植的,虽然因为它依赖于实现定义结构。
这里是一个更有趣的例子:
#include <stdint.h>
union RAX_t
{
uint64_t RAX;
uint32_t EAX;
uint16_t AX;
struct {
uint8_t AL;
uint8_t AH;
};
};
(假设little-endian的机器。)
我发现这也是非常有帮助的。 @ybungalobill – iDomo 2011-12-28 23:57:52
标题和标签说C++,但问题的身体说C:这是什么呢? – 2011-12-28 16:59:21
并注意C和C++的答案不同。在C中,这是不可能的。在C++中,它是。 – 2011-12-28 17:02:00
原则上,平台的ABI可以提供足够的定义来说明结构和联合如何布局,以便能够像您的示例那样执行某些操作(至少在字节级别)(但是,请注意,您有ESI作为5位变量,而不是名称似乎暗示的32)然而,这不是由C或C++标准定义的。 – Random832 2011-12-28 17:03:03