Стандарт определения структуры 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
Как пользователь может использовать структуру, если он не видит формат/поля? и структура НЕ должна быть typedef'd. Такое typedef'ing просто скрывает код и загромождает пространство имен компилятора. Предложение: поместите формат структуры в заголовочный файл (и, возможно, оператор extern, ЕСЛИ другим программам необходимо получить доступ к локальному экземпляру структуры).   -  person user3629249    schedule 19.03.2015
comment
@user3629249 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