Comments 18
(изображение увеличено этими вашими нейросетями)
зачем этот ужас? лучше бы исходную фотку вставили... или это аналог вуду?
Если есть возможность так радикально выбирать стандарты C то рекомендую также рассмотреть "betterC" - диалект языка D, работающий на рантайме C.
Это очень похожий на C язык, он даёт совместимость с C и дополнительные преимущества: шаблоны, RAII, вложенные функции, слайсы массивов с проверкой границ, и т.д. - фичи языка D, не требующие рантайма D и сборщика мусора.
Если речь о С, то стоило бы упомянуть о restrict. Весьма полезное нововведение. У меня был опыт сокращения размера функции процентов на 10% из-за добавления одного такого квалификатора.
Основным нововведением в C89, по сравнению с K&R, были прототипы функций.
Хотя я почему-то запомнил книгу братьев Березиных.
Так и не понял: таки они братья или просто однофамильцы. Ну очень инициалы тянут на отца и сына )))
А неплохо вы увлекли читателя...
Который заинтересовался выбором стандарта. А в итоге выбору, то, всего один абзац в конце посвящен.
И ведь покритиковать не за что - ведь сами вначале сказали:
Поэтому надеюсь, что читатель не будет ждать чёткого и однозначного ответа, какой же стандарт всё-таки выбрать в качестве руководства к действию. Возможно не столько мой ответ, сколько мои размышления, которые к этому ответу привели, будут интересны чуть более широкой аудитории
Спасибо, что ли)
Лучший стандарт Си это любой стандарт C++. Язык может всё то же самое, но обладает более богатыми возможностями. Почему кто-то ещё пишет на голом Си, для меня до сих пор остаётся загадкой.
Уж скоро 40 как шкрябаю на плоском Си, а так и не выбираю стандарт, ещё ни разу это не дало ни зарплаты, ни снижения квартплаты, вообще ничего .
По C23 есть такая страничка со списком поддерживаемых фич в компиляторах - https://en.cppreference.com/w/c/compiler_support/23
#if defined(__STDC_VERSION__) && __STDC_VERSION__ >= 202311LПрошу прощения, но режет глаз. Разрешите напомнить современное, более менее строгое, определение, параграф 13 раздел 6.10.1 Conditional inclusion, C23:
...After all replacements due to macro expansion and evaluations of defined macro expressions, has_include expressions, has_embed expressions, and has_c_attribute expressions have been performed, all remaining identifiers other than true (including those lexically identical to keywords such as false) are replaced with the pp-number 0, true is replaced with pp-number 1, and then each preprocessing token is converted into a token...
И так было всегда, например, параграф 6 (примерно) раздел 3.8.1 Conditional inclusion, C88 Third review X3J11 88-090 May 13 1988:
...After all replacements are finished, the resulting preprocessing tokens are converted into tokens, and then all remaining identifiers are replaced with 0 ...
В первой редакции книги K&R, вроде как, это свойство забыли упомянуть, но аксакалы помнят, помнят, как работал их компилятор.
Правильно писать коротко и ясно:
#if __STDC_VERSION__ >= 202311L
/* C23 compatible source code. */
#elif __STDC_VERSION__ >= 201710L
/* C17 compatible source code. */
#elif __STDC_VERSION__ >= 201112L
/* C11 compatible source code. */
#elif __STDC_VERSION__ >= 199901L
/* C99 compatible source code. */
#elif __STDC_VERSION__ >= 199409L
/* C95 compatible source code. */
#elif __STDC__
/* C89 compatible source code. */
#else
/* K&R C compatible source code. */
#endif
Выбираем стандарт языка Си в 2025 году