Майкл Берр сказал:
Также я уверен, что будут некоторые комментарии о том, как идентификатор _STRUCTNAME
зарезервирован для реализации, так что это нехорошая идея использовать эту форму в любом случае.
ОК, я игра (но я хотел немного отформатировать, чтобы вы получили ответ вместо этого):
Стандарт языка - этодоговор между автором компилятора и пользователем компилятора, в котором каждый обещает делать, а не делать определенные вещи.
Большинство идентификаторов, начинающихся с _
, зарезервированы для реализации, включая все начинающиеся идентификаторыс _
, за которым следует заглавная буква.Это означает, что компилятору разрешено использовать их для любых целей, поскольку пользователь компилятора пообещал не использовать их.
Пользователи компиляторов, нарушающие свое обещание, получают странные результаты.
И наоборот, все идентификаторы, которые [применимый] стандарт не резервирует для реализации, гарантированно будут доступны пользователю компилятора, потому что автор компилятора пообещал не использовать их.
Авторы компиляторов, которыенарушить их обещание получить требования о возврате, когда действительный код получит странные результаты.
Я предпочитаю ставить конечные _
на имена тегов, включать в себя охранники и т. д., гарантируя, что я останусь вне пространства реализации;таким образом:
typedef struct STRUCTNAME_
{
// struct contents
} STRUCTNAME;
(Некоторые пуристы недовольны typedef
s просто синтаксическим сахаром, но C тут и там нужно немного сахара, иначе это может показаться довольно мягким.)