我有一個結構,我想使變量相互關聯。這裏是一段代碼:相關結構變量?
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