Dmitry E. Oboukhov -> [email protected] @ 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 [email protected]
with a subject of "unsubscribe". Trouble? Contact [email protected]
Archive: http://lists.debian.org/[email protected]