typedef видимость - PullRequest
       11

typedef видимость

4 голосов
/ 15 апреля 2011

У меня есть пара ".c .h" файлов. В заголовочном файле (.h) я определяю 2 typedef struct , назовем их TS1 и TS2.

Теперь типом одного члена TS1 является TS2. Мне бы хотелось, чтобы только TS1 был виден. TS2 должен быть скрыт. TS2 должен быть виден только файлу ".c".

Как мне этого добиться?

Ответы [ 3 ]

6 голосов
/ 15 апреля 2011

Мне нравится называть приватные заголовочные файлы суффиксом '-internal'.Для вашего примера, я бы имел

foobar.c
    #include "foobar-internal.h"
    #include "foobar.h"
    /* functions using `struct TS1` and `struct TS2` */

.

foobar.h
    #ifndef H_FOOBAR_INCLUDED
    #define H_FOOBAR_INCLUDED
    struct TS1;
    #endif

.

foobar-internal.h
    #ifndef H_FOOBAR_INTERNAL_INCLUDED
    #define H_FOOBAR_INTERNAL_INCLUDED
    struct TS2 { int whatever; };
    struct TS1 { int whatever; struct TS2 internal; };
    #endif

Любой код, использующий ваши функции, включая более простые "foobar.h" иможно использовать указатели на struct TS1.Он не может напрямую использовать объекты типа struct TS1 или struct TS2.Фактически, включив всего лишь "foobar.h", код не имеет представления о существовании типа struct TS2 в любом месте и может переопределить его для своих собственных целей.

usercode.c
    #include "foobar.h"
    struct TS1 *x;
    x = newTS1();
    work(x);
    destroyTS1(x);
2 голосов
/ 15 апреля 2011

Я согласен с Rumple.

Вместо этого вы можете использовать, например, #define TS2 int в .h и #undef TS2 в верхней части .c файла после #include.

Хотя это не использует typedef.Вы также можете #undef это в нижней части .h файла, если вы хотите #include это в нескольких .c файлах.

0 голосов
/ 15 апреля 2011

AFAIK, это невозможно.Но у вас может быть 2 разных файла .h для TS1 и TS2.

...