C стандарт за дефиниране на структура

Програмирам на C през последните няколко години и развих навик да поставям typedef на структурата в заглавния файл и да оставя нейната дефиниция в изходния файл, така че другите да могат да използват моите файлове, без да им позволявам да объркат нещата .

// header file
typedef struct s_example EXAMPLE

// source file
struct s_example {
       // something
};

има ли нещо нередно, когато прави това, трябва ли да уведомя другите какво правя с моите структури?

Просто питам това, защото виждам, че много хора показват всичко в заглавния файл.


person HPerin    schedule 19.03.2015    source източник
comment
Ако всичко, което обработват, е указател, непълен тип е добре.   -  person Ben Voigt    schedule 19.03.2015
comment
Също така имайте предвид, че в C++ typedef е ненужен, тъй като не е нужно да използвате ключовата дума struct, когато препращате към голия тип в източника, както правите в C.   -  person aruisdante    schedule 19.03.2015
comment
Как потребителят може да използва структура, ако не може да види формата/полетата? и структурата НЕ трябва да бъде типизирана.. Такова типово дефиниране просто замъглява кода и затрупва пространството на имената на компилатора. Предложение: поставете формата на структурата в заглавния файл (и може би extern израз, АКО други програми имат нужда от достъп до екземпляр на локална структура.)   -  person user3629249    schedule 19.03.2015
comment
@user3629249 Винаги typedef a struct, така че изходният код да не е претрупан с думата struct всеки път, когато декларирам такава или я използвам като аргумент на функция. Това лоша практика ли е?   -  person Weather Vane    schedule 19.03.2015
comment
@WeatherVane: Не, не е лоша практика. Не знам откъде user3629249 взе тази идея. Но съм съгласен, че няма смисъл да се крие оформлението на структурата от програмистите, които ще я използват.   -  person TonyK    schedule 20.03.2015


Отговори (1)


Недостатъкът на наличието само на декларацията в заглавния файл е, че всички други изходни файлове, които не включват дефиницията на struct, не могат да инстанцират екземпляр на това struct, а само указател към него. Това е така, защото за тези други изходни файлове вашият struct е непълен тип. Ако това е добре за вашето приложение, тогава няма нищо лошо само с декларация в заглавката.

person wolfPack88    schedule 19.03.2015