LINUX.ORG.RU

Поясните за структуры

 , ,


0

2

Так собирается:

typedef struct {
    int a;
    int b;
} foo;
static struct {
    int x;
    foo **foos;
} bar;
А так ние:
static struct {
    int a;
    int b;
} foo;
static struct {
    int x;
    foo **foos;
} bar;
Причем ругается уже ниже, в такой строке: bar.foos = NULL;

error: ‘struct <anonymous>’ has no member named ‘foos

Почему?

★★★★★

Последнее исправление: deep-purple (всего исправлений: 2)

Ответ на: комментарий от deep-purple

Объяви в .c (в смысле внутри модуля).

Если же ты хочешь спрятать объявление, но выставлять наружу поля такого типа, то это не хорошо. В смысле можно обойти, но это путь костылей.

ziemin ★★
()
Ответ на: комментарий от deep-purple

можно пользователям библиотеки говорить, что это uint или uint64, а на самом деле это void*, которвй есть указатель на твою внутреннюю структуру mega_struct, объявление которой ты юзаешь только внутри своей либы и никому не показываешь.

metawishmaster ★★★★★
()
Последнее исправление: metawishmaster (всего исправлений: 1)
Ответ на: комментарий от ziemin

Объяви в .c (в смысле внутри модуля)

Я так и сделал. Это же не поможет спрятать, насколько я понимаю. А какие ты говоришь костыли есь? Покажи.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Хочу так, чтобы тип не был виден извне.

Какой тип? Структура? Его не будет видно «извне», из другой единицы трансляции

anonymous
()
Ответ на: комментарий от deep-purple

Это же не поможет спрятать, насколько я понимаю.

Неправильно понимаешь. .c это конечная точка. Подняться выше определение не может. Как конкретно не получилось?

ziemin ★★
()
Ответ на: комментарий от deep-purple

Щас он тебе понавыкладывает живых примеров.

Трюк со спрятанными структурами практикует qt. Скачай исходники и глянь. Это даже вроде паттерна у них.

ziemin ★★
()
Ответ на: комментарий от ziemin

Подняться выше определение не может

Ну тада я спокоен и вопрос можно считать закрытым. И спасибо за разъяснения.

deep-purple ★★★★★
() автор топика
Ответ на: комментарий от deep-purple

Анонимус выше указал правильный термин: единица трансляции. Но лично я предпочитаю представлять исходный код в виде дерева. Поэтому и написал «выше подняться не может».

ziemin ★★
()
Ответ на: комментарий от deep-purple

// починилась разметка =)

megalib_internal.h:

struct girl_context_t {
    char *name;
    int breast;
    int middle;
    int bottom;
}

megalib.h:

typedef int girl_context;

int get_bottom_size(girl_context ctx);

megalib.c:

#include «megalib.h»
#include «megalib_internal.h»

int get_bottom_size(girl_context ctx)
{
    struct girl_context_t* girl = (struct girl_context_t*)ctx;
    return girl->bottom;
}

как-то так %))

metawishmaster ★★★★★
()

В первом случае ты определяешь тип foo. Во втором переменную.

kike
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.