видимость typedef

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

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

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


person the_candyman    schedule 15.04.2011    source источник
comment
Член объявлен как указатель или структура?   -  person tia    schedule 15.04.2011


Ответы (3)


Мне нравится называть частные заголовочные файлы суффиксом «-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);
person pmg    schedule 15.04.2011
comment
Обратите внимание, что private не является ключевым словом в C. - person fnokke; 15.04.2011
comment
@fnokke: спасибо. Я изменил идентификатор на внутренний, чтобы избежать путаницы. - person pmg; 15.04.2011
comment
Но когда foobar-internal.h нигде не включается, как компилятор может знать определение TS1 и TS2? - person Niklas R; 25.06.2012
comment
@NiklasR: это невозможно. Вы должны #include "foobar-internal.h" в каком-то исходном файле; как правило, исходный файл, который имеет дело с рассматриваемыми структурами. - person pmg; 26.06.2012

Я согласен с Румпелем.

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

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

person Community    schedule 15.04.2011

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

person Rumple Stiltskin    schedule 15.04.2011