2011-12-28 6 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

Нет, это точно причина, почему переменные обычно инкапсулируют методы.

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

Смежные вопросы