_tЗазвичай обертає непрозоре визначення типу.
GCC просто додає імена, які закінчуються, _tдо зарезервованого простору імен, яке ви не можете використовувати, щоб уникнути конфліктів із майбутніми версіями Standard C та POSIX (посібник з бібліотеки GNU C) . Після деяких досліджень я нарешті знайшов правильну посилання всередині стандарту POSIX (1003.1, обгрунтування (інформативне)):
B.2.12 Типи даних
Вимога про те, що додаткові типи, визначені в цьому розділі, закінчуються на "_t" ', викликана проблемою забруднення простору імен. Важко визначити тип (де цей тип не визначений IEEE Std 1003.1-2001) в одному файлі заголовка і використовувати його в іншому без додавання символів до простору імен програми. Щоб дозволити виконавцям надавати власні типи, всі відповідні програми повинні уникати символів, що закінчуються символом "_t", що дозволяє виконавцю надавати додаткові типи. Оскільки основне використання типів полягає у визначенні членів структури, які можна (і в багатьох випадках повинні) додавати до структур, визначених у IEEE Std 1003.1-2001, необхідність у додаткових типах є переконливою.
Коротше кажучи, Стандарт каже, що є великі шанси на розширення списку типів стандарту, тому Стандарт обмежує _tпростір імен для власного використання.
Наприклад, ваша програма відповідає POSIX 1003.1 Випуски 6, і ви визначили тип foo_t. POSIX 1003.1 Випуски 7 , врешті-решт, випускається із заново визначеним типом foo_t. Ваша програма не відповідає новій версії, що може бути проблемою. Обмеження _tвикористання перешкоджає рефакторингу коду. Таким чином, якщо ви прагнете до відповідності POSIX, вам неодмінно слід уникати _tстандартних стандартів.
Побічна примітка: особисто я намагаюся дотримуватися POSIX, тому що я думаю, що це дає хороші основи для чистого програмування. Більше того, мені дуже подобаються вказівки щодо стилю кодування Linux (глава 5) . Є кілька вагомих причин, чому не використовувати typedef. Сподіваюся, що це допоможе!
int_tвизначено? Якщо це завжди визначається якint, це не корисно; набагато зрозуміліше використовуватиintбезпосередньо. Якщо це не завжди визначається якint(скажімо, якщо це могло бутиlong intабоshort int), то це погано вибране і заплутане ім'я.