Ресурсы для обучения C дизайн программы

Исходя из фона OO (C # / java) Я ищу ресурсы, чтобы научиться хорошо разрабатывать чистые программы.

Пока я знаком с синтаксисом C, и я могу писать небольшие программы, я не уверен в том, что нужно применять для более крупных приложений и какие методы использовать. Все, что вы, ребята, можете рекомендовать.

EDIT: Я рад полностью отказаться от OO для программирования на C, я заинтересован в том, как структурировать программу без OO, я хочу узнать о хороших способах разработки программ на процедурных языках, таких как C.

В этой публикации есть список книг unix, который включает в себя большинство classических работ C / Unix. Для программирования на C в Windows, программирование Windows Petzold, вероятно, лучший старт.

Для разработки программ C некоторые из книг по программированию unix расскажут вам fragmentы, но я не знаю о книге «C program architecture».

Если вы привыкли к java, некоторые советы для программирования на C:

  1. Используйте стек . Часто, когда вы вызываете процедуру, вы хотите иметь переменные, выделенные в стеке стека вызывающего, и передать им указатели в процедуру, которую вы хотите вызвать. Это будет значительно быстрее, чем динамическое распределение памяти с помощью malloc() и гораздо меньше подверженности ошибкам. Делайте это, когда это необходимо.

  2. C не делает сборку мусора, поэтому динамическое распределение элементов данных более сложно, и вы должны следить за ними, чтобы убедиться, что они освобождены. Переменные, выделенные в стеке (см. 1), более «идиоматичны», если они применимы. Кроме того, вам не нужно их освобождать – это бонус для локальных переменных.

  3. По поводу (2) рассмотрим архитектуру, в которой ваши функции возвращают код состояния или ошибки и передают данные в стек и выходят с использованием стека согласно (1).

  4. Узнайте, что делают setjmp() и longjmp() . Они могут быть весьма полезны для общих механизмов обработчика ошибок вместо функциональных возможностей обработки структурированных исключений.

  5. C не поддерживает исключения. См. (3).

  6. Линт – твой друг. Шина еще более дружелюбна.

  7. Узнайте, что делает препроцессор и что вы не должны делать с ним, даже если можете.

  8. Изучите входы и выходы endian-ness , выравнивание слов , арифметику указателей и другую низкоуровневую архитектурную аркану. Вопреки распространенному мнению, это не ракетостроение. Если вы чувствуете увлеченность, попробуйте освоить язык ассемблера и получить от этого хорошее знание. Он многое сделает для вашего понимания того, что происходит в вашей программе на C.

  9. C не имеет понятия об объеме модуля, поэтому планируйте свое использование включений, деклараций прототипов и использования extern и static для создания частных областей и идентификаторов импорта.

  10. Программирование GUI на C является утомительным на всех платформах.

  11. По поводу (10) изучить C API по крайней мере одного языка сценариев, таких как Tcl , Lua или Python. Во многих случаях наилучшее использование C является основным высокопроизводительным движком в приложении, которое в значительной степени написано в чем-то другом.

  12. Эквивалентом конструктора является инициализирующая функция, в которой вы передаете указатель на элемент, который хотите настроить. Часто вы можете видеть это в виде вызова функции, которая выглядит как setup_foo(&my_foo) . Лучше выделить выделение из инициализации, так как вы можете использовать эту функцию для инициализации элемента, который вы выделили в стеке. Аналогичный принцип применяется к деструкторам.

  13. Большинство людей считают венгерскую нотацию такой же удобочитаемой, как и венгерский. Исключением из этого являются родные венгерские ораторы, которые, как правило, считают венгерскую нотацию столь же parsingчивой, как и клинопись. , К сожалению, венгерская нотация широко встречается в программном обеспечении Windows, и весь Win32 API использует ее, ожидая влияния на читаемость программного обеспечения, написанного на этой платформе.

  14. Книги C / Unix, даже очень хорошие, такие как те, что написаны покойным Ричардом Стивенсом, как правило, доступны довольно дешево через рынок Amazon. В каком-либо конкретном порядке получите копию K & R, Stevens APUE и UNP 1 и 2, книгу Дракона, Rochkind, Programming Pearls, Petzold и Richter (если они работают в Windows) и любые другие classические работы C / Unix. Прочитайте, нарисуйте на них карандашом и, как правило, общайтесь с книгами.

  15. В Интернете много, много хороших ресурсов программирования C / Unix .

  16. Прочтите и поймите Десять заповедей программирования на C и часть мета-дискуссии о том, почему и почему за этими заповедями. Это покажет свой возраст в определенной степени, хотя большая его часть по-прежнему актуальна, и неясные компиляторы по-прежнему довольно распространены в мире встроенных систем .

  17. Лекс и Якк – ваш друг, если вы хотите писать парсеры.

  18. Как указывает Navicore ниже (+1) , «C-интерфейсы и реализации» Hanson – это безупречный дизайн интерфейса / реализации для модульной архитектуры с кучей примеров. Я действительно слышал об этой книге и слышал об этом, хотя я не могу утверждать, что прочитал ее. Помимо C-идиом, которые я описал выше, эта концепция, возможно, является kernelм хорошего процедурного дизайна. Фактически, другие процедурные языки, такие как Modula-2, действительно делают эту концепцию явной в их дизайне. Это может быть самым близким к книге «C Program Architecture» в печати.

  19. Читайте FAQ по C.

Мои проблемы с OO обратно на C были рассмотрены в «Интерфейсах и реализациях» Дэвида Хэнсона.

C Интерфейсы и реализации

Серьезно, его подход сделал огромную разницу в том, чтобы избежать случайного создания большого шара пряжи, к которому приходят многие системы, не связанные с оо.

minix от tanenbaum

Вот несколько интересных ответов от другого вопроса, касающегося программирования OO в C. Я сделал сообщение о некотором C-коде, с которым я работал, с которым в основном пошаговая объектная ориентация останавливается как можно короче, не включая виртуальные методы.

Если бы я делал C-кодирование, я бы использовал эту технику для определения «объектов».

Я считаю, что использование шаблонов проектирования всегда полезно и может быть реализовано на большинстве языков.

Вот хороший PDF, обсуждающий объектно-ориентированное программирование на С.

Большие приложения? Сила C – это когда вам приходится иметь дело с вещами низкого уровня, такими как драйверы устройств, планировщики и другие приправленные ОС.

Вы можете сделать C, который работает как OO, но это будет окончательно ощущаться как упражнение при повторном создании колеса.

Одна из незначительных вещей – заказать ваши .c-файлы «назад» – то есть поместить main () в конец файла и всегда следить за тем, чтобы локальные функции (те, которые не находятся в вашем .h-файле, который вы только что написали для использования в этом файле) живут выше, где они впервые используются. Это означает, что вам не нужно писать для них прототипы, что является одним из немногих, с чем можно столкнуться, если вам нужно изменить свой API.

Затем, в качестве бонуса, команда «gD» в vim всегда будет обращаться к определению функции, если она находится в том же файле 🙂

Хотя он написан как несколько языковой-агностический текст, Code Complete предоставляет много хороших рекомендаций по структуре кода и организации, а также по строительной практике.