Любой способ в C, чтобы объявить struct в заголовке без использования указателя в других файлах? - PullRequest
1 голос
/ 02 сентября 2011

Предположим, у меня есть это в list.h:

typedef struct list_t list_t;
typedef struct list_iter_t list_iter_t;
list_iter_t iterator(list_t *list);

и затем определите их в list.c:

typedef struct node_t {
    ...
} node_t;

struct list_iter_t {
    node_t *current;
    // this contains info on whether the iterator has reached the end, etc.
    char danger;
};

struct list_t {
    ...
}

list_iter_t iterator(list_t *list) {
    list_iter_t iter;
    ...
    return iter;
}

Могу ли я что-нибудь сделать, кроме включения объявления структуры в заголовочный файл, чтобы в некотором файле test.c я мог иметь:

#include "list.h"

void foo(list_t *list) {
    list_iter_t = iterator(list);
    ...
}

Как, может быть, сказать компилятору размер хранилища list_iter_t как-нибудь? Использовать указатель неудобно (не потому, что это указатель, а по другим причинам), но в то же время я бы хотел как можно больше скрыть детали реализации.

Ответы [ 2 ]

3 голосов
/ 02 сентября 2011

Краткий ответ - «Нет».

Способ, которым вы указываете компилятору размер struct, заключается в том, чтобы сообщить ему подробности структуры struct. Если вы хотите выделить объект, а не указатель на объект, компилятор должен знать полный тип объекта. Вы также не можете получить доступ к членам структуры через указатель на структуру, если тип является неполным. То есть компилятор должен знать смещение и тип члена, чтобы сгенерировать правильный код для доступа к someptr->member (а также для выделения somevalue или доступа somevalue.member).

1 голос
/ 02 сентября 2011

Это можно сказать компилятору размер структуры, используя фиктивное определение, например:

struct node_t {
    char dummy[sizeof(struct { ... })];
};

(вместо правильного определения, доступного для файла реализации).

Формально это вызывает неопределенное поведение; хотя на практике это, скорее всего, сработает.

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

...