2011-12-28 19 views
1

私は、変数を互いに関連づけたいという構造を持っています。ここでは、コードの抜粋です:構造変数を関連付ける?

struct RSI 
{ 
    int RSI; 
    int ESI = RSI & 0x1F; 
    int SI = ESI & 0x0F; 
    int SIL = SI & 0x08; 
}; 

は、変数を変更する機能を作成することなく、Cでこれを行う方法はありますか?

+5

タイトルとタグがC++と言うが、質問の本体はCと言う:それはここで

はより興味深い例でありますか? –

+1

CとC++の答えが異なることに注意してください。 Cでは、それは不可能です。 C++ではそうです。 –

+1

原則として、プラットフォームのABIは、あなたの例のような何かを少なくともバイトレベルまで行うことができるように構造体と共用体がどのようにレイアウトされているかについて十分な定義を提供するかもしれません(ただし、ESIは5ビットの変数、名前が暗示していると思われる32ではなく)。ただし、これはCまたはC++標準では定義されていません。 – Random832

答えて

4

いいえ、そうするために関数を定義する必要があります。 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; } 
}; 

+1

あなたの答えは「いいえ」がCに当てはまりますが、あなたのコードはC++を示しています。これは実際に可能です(一般的にはアドバイスしていません)。どちらですか? –

+0

うわー、ありがとうと思います:) – iDomo

+0

@KonradRudolph:関数なしでは不可能だと言っていますが、C++では詳細をいくらかカプセル化することができます。 –

0

いいえ。これは、正確に変数は通常の方法でencapsuledされている理由です。あなたが書くことができ、あなたの特定のケースで

2

:それは実装定義の構造に依存しているので、

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; 
    }; 
}; 

(リトルエンディアンのマシンを前提としています。)

+0

これもまた非常に有用であることが判明しました。 @ybungalobill – iDomo

関連する問題