Dmitry E. Oboukhov -> debian-russian@lists.debian.org  @ Mon, 8 Oct 2012 
12:41:05 +0400:

 DEO> имеется некая структурка

 DEO> struct something {
 DEO>     ...

 DEO>     unsigned count;
 DEO>     unsigned element[0];
 DEO> };

 DEO> то есть в поле count сказано сколько элементов будет после структурки.
 DEO> ну и обращение к ним идет так:

 DEO> for (i = 0; i < s->count; i++) {
 DEO>     s->elements[i] = i;
 DEO> }


 DEO> теперь когда мы это хотим саллоцировать, то пишем такой аллокатор

 DEO> struct something * some_alloc(unsigned size) {
 DEO>     return malloc(sizeof(struct something) + sizeof(unsigned) * size);
 DEO> }


 DEO> а вот если появилась необходимость саллоцировать такой объект
 DEO> статически, как быть?

 DEO> хочется макрос 

 DEO> #define SOMETHING(name, size) ...

 DEO> чтобы пользователь мог сказать

 DEO> void foo(void) {
 DEO>     static SOMETHING(name, 5);
 DEO>     SOMETHING(name2, 10);
 DEO> }

 DEO> и получить саллоцированный на стадии компиляции (или в стеке) такой 
объект?

Так вот сходу не поручусь, но я бы делал что-то типа танцев вокруг 

union {
    struct something #name;
    char[sizeof(struct something) + sizeof(unsigned)*size];
};

Но там потанцевать вокруг имен придется, чтобы получить-таки на выходе
интересующий тебя name.  На ум приходит фокус с errno, который макрос,
разворачивающийся во что-то типа *(per_thread_errno_ptr()).

Позаниматься построением работающего решения не готов.

И слово static, скорее всего, придется запихивать внутрь макроса.


-- 
To UNSUBSCRIBE, email to debian-russian-requ...@lists.debian.org
with a subject of "unsubscribe". Trouble? Contact listmas...@lists.debian.org
Archive: http://lists.debian.org/87obkdtetj....@wizzle.ran.pp.ru

Ответить