Re: а кто C хорошо знает?
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, скорее всего, придется запихивать внутрь макроса.
Reply to: