Как объявить extern typedef struct? - PullRequest
6 голосов
/ 12 июля 2010

У меня есть два файла c, foo.c с функциональностью и test_foo.c, которые тестируют функции foo.c.

Есть ли способ доступа к struct typedef BAR Я определил в foo.c в test_foo.c без использования файла заголовка? До сих пор мне удалось избежать файла h, так что вся программа будет состоять из foo.c. Спасибо.

foo.c   
typedef struct BAR_{...} bar;
BAR *bar_new(...) {..}

test_foo.c
extern BAR *bar_new(...)

error: expected declaration specifiers or ‘...’ before ‘BAR’

Ответы [ 3 ]

6 голосов
/ 12 июля 2010

Ответ таков: он есть, и вы должны использовать вместо него файл заголовка.Вы можете скопировать определение структуры typedef struct BAR_{...} bar; в test_foo.c, и оно будет работать.Но это вызывает дублирование.Каждое работающее решение должно сделать реализацию struct доступной для компилятора в test_foo.c.Вы также можете использовать ADT, если это подходит вам в этом случае.

4 голосов
/ 12 июля 2010

Отбросьте typedef.

В foo.c:

struct bar 
{
    ...
};

struct bar *bar_new(....)
{
    return malloc(sizeof(struct bar));
}

В test_foo.c:

struct bar;

struct bar *mybar = bar_new(...);

Обратите внимание, что таким образом вы получаете существование объекта struct bar, пользователь в test_foo.c ничего не знает о содержимом объекта.

1 голос
/ 12 июля 2010

Вам необходимо указать определение BAR в test_foo.c. Является ли это дублирование предпочтительным по сравнению с заголовком, зависит от вас.

...