`sizeof` структура в определении объединения - PullRequest
1 голос
/ 14 февраля 2020

Для доступа к struct побайтно, я использую union.

typedef struct {
    char hi;
    char lo;
} range;

union {
    range by_name;
    char as_bytes[sizeof(range)];
} U1;

char use_U1(void){
    char c = U1.as_bytes[0];
    return U1.by_name.hi;
}

Вопрос 1: Можно ли пропустить typedef? Например:

union {
    struct {
        char hi;
        char lo;
    } by_name;
    char as_bytes[2]; //want sizeof()
} U2;

Наивный char as_bytes[sizeof(by_name)] не компилируется:
ошибка: здесь не объявлено 'by_name' (не в функции)

Вопрос 2: То же самое, но с анонимной структурой, чтобы избежать ввода .by_name при использовании.

union {
    struct {
        char hi;
        char lo;
    };
    char as_bytes[2]; //want sizeof()
} U3;

int use_U3(void){
    char c = U3.as_bytes[0];
    return U3.hi; // anonymous structure
}

Прочитать до сих пор: union , struct

Ответы [ 3 ]

3 голосов
/ 14 февраля 2020

Вы не можете принять размер анонимного типа, поэтому просто сделайте его не анонимным:

union 
{
    struct range// <<< give it a tag here
    { 
        char hi;
        char lo;
    } by_name;

    char as_bytes[sizeof(struct range)]; // <<< Take sizeof here

} U2;

Вы также можете создать вложенный typedef, хотя он, возможно, и не имеет большого значения:

union 
{
    typedef struct 
    {
        char hi;
        char lo;
    } range ; 

    range by_name;

    char as_bytes[sizeof(range)];
} U2;
3 голосов
/ 14 февраля 2020

Вы можете присвоить struct имя тега и использовать его.

union {
    struct inner {
        char hi;
        char lo;
    } by_name;
    char as_bytes[sizeof(struct inner)];
} U2;

Обратите внимание, что для этого требуется, чтобы внутренняя структура имела имя. Если имени нет, тег должен быть опущен.

1 голос
/ 14 февраля 2020

Более простая версия не переносимая (если вы планируете использовать компиляторы не g cc или mvs c):

union {
    struct{
        char hi;
        char lo;
    };
    char as_bytes[0];
} U2;
...