Rezerwacja miejsca w strukturze

0

Witam!

Potrzebuję zrobić pewne offsety pomiędzy danymi w strukturze.
Wszystko proste ALE:
Zarezerwowane miejsca nie mogą mieć nazw!

// przykladowy przyklad
struct struct_t{
  char rsvd1[32];
  int a;
  char rsvd2[32];
  int b;
};

Wymyśliłem coś takiego:

#define SPACE char:256

struct struct_t{
    SPACE;
    int a;
    SPACE;
    int b;
};

Lecz dostaję komunikat:

width of 'struct_t::<anonymous>' exceed its type

Warningów nikt nie lubi ;)
Wszystko zrozumiałe, ale jak to inaczej zrobić?

Uwaga:

  • inty są przykładem, będą to różne typy o różnych długościach
  • struktura jest obarczona atrybutem __attribute__((packed))
  • wszystko musi być statycznie, wszystko przygotowane podczas kompilacji
0

Pomysł kolejny:

#include <stdio.h>

#define SPACE(size) \
struct{} __attribute__((aligned(size)));

struct struct_t{
    int a;
    SPACE(16);
    int b;
} __attribute__((packed));

int main(){
    struct struct_t * test;
    test = (struct struct_t*)0;
    printf("a: %d\n", &test->a);
    printf("b: %d\n", &test->b);
    return 0;
}

a: 0
b: 20

Jest OK, ale wydaje mi się, że natrafiłem kiedyś na kompilatory które nie lubiły:

__attribute__((aligned(size)))

oraz:

__attribute__((packed))

Na "packed" jest inne rozwiązanie:

#pragma pack(push, 1)
//...//
#pragma pack(pop)

A dla aligned jakieś rozwiązanie?

2

Bez nazw się nie da, ale czy na pewno nie może ich być? Nawet jeśli będą generowane automatycznie?

#define JOIN(a,b) a ## b
#define JOIN_HELPER(a,b) JOIN(a,b)
#define MAKE_UNIQ(a) JOIN_HELPER(a, __LINE__)

#define FILL(Size) char MAKE_UNIQ(fill)[Size];

struct Foo
{
	uint32_t value;
	FILL(124)
	uint16_t otherValue;
	uint16_t evenOtherValue;
	FILL(124)
	uint64_t lastValue;
};

http://melpon.org/wandbox/permlink/U7Prem6vS7dD5E1B

0

Jasne, lecz także chciałbym uniknąć zbędnego syfu przy autouzupełnianiu.

0

Jak byś się chciał odwoływać do zmiennych które nie mają nazw? Telepatycznie?

1

Nie wiem zbytnio co przeszkadzają Ci nazwy wszelakich paddingów :P Ale jeśli chcesz się ich pozbyć, to jakiś możesz zastosować jakiś view do surowych danych.

np: http://ideone.com/yBUOcU

#include <stdio.h>

typedef char raw_structure_t[32];

typedef struct{
    int *a, *b;
}  structure_view_t;

structure_view_t create_structure_view(raw_structure_t data){
    structure_view_t view = {
        .a = (int*)&data[10],
        .b = (int*)&data[23]
    };
    return view;
}

int main(){
    raw_structure_t data;
    structure_view_t view = create_structure_view(data);
    
    *view.a = 1;
    *view.b = 2;
    
    printf("%d %d", *view.a, *view.b);
    
    return 0;
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1